Объединение словарей в один список словарей по уникальному идентификатору - PullRequest
1 голос
/ 27 мая 2020

Я не уверен, как лучше всего описать то, что мне нужно - это не совсем простое слияние словарей, поэтому сложить их вместе или распаковать не получится. Вероятно, проще сравнить то, что я хочу, с pandas слиянием - объединением по общему ключу, что приведет к появлению дополнительных столбцов / строк в зависимости от входных данных.

Я начинаю со следующих списков:

a = [{'GlobalID': '1e6afb53-9276-495a-81e0-1462b765fa67', 'aResult': 1}]
b = [{'GlobalID': '1e6afb53-9276-495a-81e0-1462b765fa67', 'bResult': 1}]
c = [{'GlobalID': '1e6afb53-9276-495a-81e0-1462b765fa67', 'cResult': 1}]
d = [{'GlobalID': '1e6afb53-9276-495a-81e0-1462b765fa67', 'dResult': 0},
  {'GlobalID': '43e405ee-a680-4958-a3c4-e64344a04786', 'dResult': 1},
  {'GlobalID': '2914fe6f-483c-479e-a1fa-2817737546bf', 'dResult': 0}
]

И я хочу объединить их так, чтобы получить только уникальные GlobalID и любые соответствующие результаты:

[
 {'GlobalID': '1e6afb53-9276-495a-81e0-1462b765fa67', 'aResult': 1, 'bResult': 1, 'cResult': 1, 'dResult': 0}, 
 {'GlobalID': '43e405ee-a680-4958-a3c4-e64344a04786', 'dResult': 1}, 
 {'GlobalID': '2914fe6f-483c-479e-a1fa-2817737546bf', 'dResult': 0}
]

Есть ли простой способ сделать это? Буду признателен за любые идеи / ресурсы, на которые мне могут указать люди.

Спасибо!

1 Ответ

2 голосов
/ 27 мая 2020
lists = [a, b, c , d] # consider you have more than 4 lists
merged_dicts = dict({}) # create a dictionary to save the result
for l in lists: # loop on the lists
    for doc in l: # loop on the documents on each list
        GlobalID = doc['GlobalID'] # get the id of the document
        if GlobalID in merged_dicts: # check if we already found a doc with the same id
            old_doc = merged_dicts[GlobalID] # if yes we get the old merged doc
            for key in doc: # we loop over the contents of the new document
                old_doc[key] = doc[key] # we add the values to the doc result
            merged_dicts[GlobalID] = old_doc # and we change the result in the result dictionary
        else: # if not add the doc to the dictionary
            merged_dicts[GlobalID] = doc
merged_dicts.values()

Вывод:

[{'GlobalID': '43e405ee-a680-4958-a3c4-e64344a04786', 'dResult': 1},
 {'GlobalID': '1e6afb53-9276-495a-81e0-1462b765fa67',
  'aResult': 1,
  'bResult': 1,
  'cResult': 1,
  'dResult': 0},
 {'GlobalID': '2914fe6f-483c-479e-a1fa-2817737546bf', 'dResult': 0}]
...