Pythonic способ объединения 2 списков диктов на основе общих ключей - PullRequest
0 голосов
/ 06 декабря 2018

У меня есть 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 Ответ

0 голосов
/ 06 декабря 2018

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

>>> 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}]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...