[英]How can I combine dictionaries with the same keys?
我有一個這樣的字典列表:
dicts = [
{'key_a': valuex1,
'key_b': valuex2,
'key_c': valuex3},
{'key_a': valuey1,
'key_b': valuey2,
'key_c': valuey3},
{'key_a': valuez1,
'key_b': valuez2,
'key_c': valuez3}
]
我想用這些來構建一個像這樣的大字典:
big_dict = {
'key_a': [valuex1, valuey1, valuez1],
'key_b': [valuex2, valuey2, valuez2],
'key_c': [valuex3, valuey3, valuez3]
}
有什么優雅的“ zip ”之類的方法可以讓我做到這一點嗎?
所有的鍵總是相同的。
big_dict = {}
for k in dicts[0]:
big_dict[k] = [d[k] for d in dicts]
或者,通過聽寫理解:
{k: [d[k] for d in dicts] for k in dicts[0]}
您可以使用collections.defaultdict
。 這個解決方案的好處是它不需要鍵在字典之間保持一致,並且它仍然保持最小的 O( n ) 時間復雜度。
from collections import defaultdict
dict_list = [{'key_a': 'valuex1', 'key_b': 'valuex2', 'key_c': 'valuex3'},
{'key_a': 'valuey1', 'key_b': 'valuey2', 'key_c': 'valuey3'},
{'key_a': 'valuez1', 'key_b': 'valuez2', 'key_c': 'valuez3'}]
d = defaultdict(list)
for myd in dict_list:
for k, v in myd.items():
d[k].append(v)
結果:
print(d)
defaultdict(list,
{'key_a': ['valuex1', 'valuey1', 'valuez1'],
'key_b': ['valuex2', 'valuey2', 'valuez2'],
'key_c': ['valuex3', 'valuey3', 'valuez3']})
如果所有的字典都有相同的鍵集,這將起作用:
dict((k, [d[k] for d in dictList]) for k in dictList[0])
如果它們可能有不同的鍵,您需要首先通過對各種字典的鍵執行集合聯合來構建一組鍵:
allKeys = reduce(operator.or_, (set(d.keys()) for d in dictList), set())
然后你需要防止在某些指令中丟失鍵:
dict((k, [d[k] for d in [a, b] if k in d]) for k in allKeys)
如果您樂於使用 3rd 方庫,則可以使用 Pandas。 pd.DataFrame
構造函數直接接受字典列表:
import pandas as pd
res = pd.DataFrame(dictList).to_dict(orient='list')
{'key_a': ['valuex1', 'valuey1', 'valuez1'],
'key_b': ['valuex2', 'valuey2', 'valuez2'],
'key_c': ['valuex3', 'valuey3', 'valuez3']}
您可以通過以下方式合並字典:
def merge_dicts(dict_list, separator=''):
"""
Merges list of dictionaries to a single dictionary, Concatenates values with the same key.
:param dict_list: list of dictionaries to be merged.
:param separator: separator to be inserted between values of same key.
:return: Merged dictionary.
"""
return {k1: separator.join([d[k1] for d in dict_list if k1 in d])
for k1 in set(reduce(lambda x, y: x+y, [k.keys() for k in dict_list]))
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.