簡體   English   中英

合並兩個字典列表

[英]merge two lists of dicts

假設我有兩個字典列表。 這些鍵的名稱和編號相同。 但是,值相同或不同。 輸出:合並值的字典列表。

list_a = [{'token_a': ['ab', 'cd', 'ef', 'hello', 'there']}, {'token_b': ['abc', 'rcd', 'gef', 'more', 'values']}]
list_b = [{'token_a': ['ab', 'cd', 'dfcdef']}, {'token_b': ['abc', 'rcd', 'jdhfgef']}]

預期輸出:

output_list = [{'token_a': ['ab', 'cd', 'ef', 'dfcdef', 'hello', 'there']}, {'token_b': ['abc', 'rcd', 'gef', 'jdhfgef', 'more', 'values']}]

這是我嘗試的操作:-定義合並一對字典的fn-然后,對每個對(從兩個列表中)在for循環中運行此fn。

def merge_pair_of_dicts(d1, d2):
    final_values = []
    merged_dict = {}
    for k, v1 in d1.items():
        for _, v2 in d2.items():
            values = [v1 + v2]
            values = [item for sublist in values for item in sublist]
            final_values = list(set(values))
        merged_dict = {k: final_values}
    return merged_dict


zipped_lists = list(zip(list_a, list_b))
print(zipped_lists)

final_list_of_dicts = []
for dict_pair in zipped_lists:
    d1 = dict_pair[0]
    d2 = dict_pair[1]
    merged_dict = merge_pair_of_dicts(d1, d2)
    final_list_of_dicts.append(merged_dict)

print(final_list_of_dicts)

我上面的過程是可讀的,可以完成工作。 但是,有沒有更好的方法可以合並兩個字典列表呢?

在單個列表理解和set對象中:

list_a = [{'token_a': ['ab', 'cd', 'ef', 'hello', 'there']}, {'token_b': ['abc', 'rcd', 'gef', 'more', 'values']}]
list_b = [{'token_a': ['ab', 'cd', 'dfcdef']}, {'token_b': ['abc', 'rcd', 'jdhfgef']}]

res= [{k: list(set(v + list_b[i][k]))}
       for i, d in enumerate(list_a) for k, v in d.items()]
print(res)

輸出:

[{'token_a': ['ab', 'there', 'dfcdef', 'cd', 'ef', 'hello']}, {'token_b': ['more', 'jdhfgef', 'abc', 'values', 'gef', 'rcd']}]

這是defaultdict的一個很好的例子。

from collections import defaultdict
dd = defaultdict(set)

for dct in  list_a + list_b:
    for key,value in dct.items():
        dd[key] = list(set(dd[key]).union(set(value)))

結果

defaultdict(set,
            {'token_a': ['ef', 'cd', 'dfcdef', 'ab'],
             'token_b': ['jdhfgef', 'gef', 'abc', 'rcd']})

一個班輪是

[{k: list(set(v+b.values()[0]))} for a in list_a for b in list_b for k,v in a.iteritems() if k in b.keys()]

結果:

[{'token_a': ['dfcdef', 'ab', 'ef', 'cd']},
 {'token_b': ['rcd', 'abc', 'gef', 'jdhfgef']}]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM