У меня есть 2 списка словарей:

dict1 = [{"a":1, "b":2, "c":1295}, {"a":2, "b":5, "c":6274}, {"a":3, "b":1, "c":5337}]

А также

dict2 = `[{"a":1, "b":2, "d":1884}, {"a":2, "b":5, "d":2049}, {"a":3, "b":3, "d":1086}]

Первый список содержит ключи "a", "b" и "c", а второй список содержит ключи "a", "b" и "d".

Я хочу создать список объединенных диктов, имеющих все 4 ключа. Необходимо объединить только слова с одинаковыми значениями для "a" и "b".

Ожидаемый результат выглядит так:

[{"a":1, "b":2, "c":1295, "d":1884}, {"a":2, "b":5, "c":6274, "d":2049}]

Я ищу Pythonic способ сделать это.

1
Tuhin Sah 6 Дек 2018 в 01:12

1 ответ

Лучший ответ

Предполагая, что кандидаты на слияние из двух списков являются диктаторами из одной и той же позиции, вы можете объединить свои списки вместе, использовать понимание списка и использовать ** - синтаксическая идиома для слияния двух dicts.

>>> dicts1 = [{"a":1, "b":2, "c":1295}, {"a":2, "b":5, "c":6274}, {"a":3, "b":1, "c":5337}]
>>> dicts2 = [{"a":1, "b":2, "d":1884}, {"a":2, "b":5, "d":2049}, {"a":3, "b":3, "d":1086}]
>>> 
>>> [{**d1, **d2} for d1, d2 in zip(dicts1, dicts2) if all(d1[k] == d2[k] for k in ('a', 'b'))]
[{'a': 1, 'b': 2, 'c': 1295, 'd': 1884},
 {'a': 2, 'b': 5, 'c': 6274, 'd': 2049}]

Бонус pandas решение:

>>> df1 = pd.DataFrame(dicts1)
>>> df2 = pd.DataFrame(dicts2)
>>> 
>>> df1
   a  b     c
0  1  2  1295
1  2  5  6274
2  3  1  5337
>>> 
>>> df2
   a  b     d
0  1  2  1884
1  2  5  2049
2  3  3  1086
>>> 
>>> pd.merge(df1, df2, on=['a', 'b']).to_dict(orient='records')
[{'a': 1, 'b': 2, 'c': 1295, 'd': 1884},
 {'a': 2, 'b': 5, 'c': 6274, 'd': 2049}]
4
timgeb 5 Дек 2018 в 22:31