Какой самый быстрый способ объединения диктов с одинаковыми указанными c ключами и значениями в двух списках? - PullRequest
0 голосов
/ 10 апреля 2020

Предположим, у меня есть два списка диктов:

dict_list1 = [{'id': 'id1', 'sub_id': 'sub_id1', 'key1': 'value1'}, 
              {'id': 'id2', 'sub_id': 'sub_id2', 'key3': 'value3'}]
dict_list2 = [{'id': 'id1', 'sub_id': 'sub_id1', 'key2': 'value2'}, 
              {'id': 'id2', 'sub_id': 'sub_id2', 'key4': 'value4'}]

Я хочу объединить их так, чтобы словари с одинаковыми 'id' и 'sub_id' сливались, становясь так:

final_list=[{'id': 'id1', 'sub_id': 'sub_id1', 'key1': 'value1', 'key2': 'value2'},
           {'id': 'id2', 'sub_id': 'sub_id2', 'key3': 'value3', 'key4': 'value4'}]

Прямо сейчас я делаю так:

final_list = []
    for dict1 in dict_list1:
        for dict2 in dict_list2:
            if attrs['id'] == seats['id'] and \
                    attrs['sub_id'] == seats['sub_id']:
                final_list.append({**dict1, **dict2})
                break

Но это выглядит очень плохо. Есть ли лучший / более быстрый способ сделать это?

1 Ответ

2 голосов
/ 10 апреля 2020

Вы можете использовать defaultdict здесь. Используйте itertools.chain для объединения обоих списков диктов, или вы просто делаете final=dict1+dict2, но я предпочитаю использовать chain.

from collections import defaultdict
from itertools import chain
dict_list1 = [{'id': 'id1', 'sub_id': 'sub_id1', 'key1': 'value1'}, 
              {'id': 'id2', 'sub_id': 'sub_id2', 'key3': 'value3'}]
dict_list2 = [{'id': 'id1', 'sub_id': 'sub_id1', 'key2': 'value2'}, 
              {'id': 'id2', 'sub_id': 'sub_id2', 'key4': 'value4'}]

final=chain(dict_list1,dict_list2) #You can just do final=dict_list1+dict_list2

out=defaultdict(dict)
for d in final:
    k=(d['id'],d['sub_id'])
    out[k].update(d)

list(out.values())
# [{'id': 'id1', 'sub_id': 'sub_id1', 'key1': 'value1', 'key2': 'value2'},
#  {'id': 'id2', 'sub_id': 'sub_id2', 'key3': 'value3', 'key4': 'value4'}]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...