假设我有一个像这样的词典列表:
dict[0] is
{'key_a': valuex1,
'key_b': valuex2,
'key_c': valuex3}
dict[1] is
{'key_a': valuey1,
'key_b': valuey2,
'key_c': valuey3}
dict[2] is
{'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” - 这样的方式让我这样做?
所有的钥匙总是相同的。
我总是可以迭代每个键上的键并构建一个新的列表字典,但这看起来非常像蟒蛇一样。
答案 0 :(得分:10)
big_dict = {}
for k in dicts[0]:
big_dict[k] = [d[k] for d in dicts]
(我将您的dict
重命名为dicts
,因为dict是内置的,而且dicts更有意义。)
或者,用词典理解:
{ k:[d[k] for d in dicts] for k in dicts[0] }
或者,对于Python< 2.7:
dict((k, [d[k] for d in dicts]) for k in dicts[0])
答案 1 :(得分:3)
如果所有的词组都有相同的键组,那么这将起作用:
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)
答案 2 :(得分:0)
您可以通过以下方式合并字典:
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]))
}
答案 3 :(得分:0)
您可以使用collections.defaultdict
。这种解决方案的好处是,它不需要字典之间的键是一致的,并且仍然保持最小的O( n )时间复杂度。
from collections import defaultdict
dictList = [{'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 dictList:
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']})
答案 4 :(得分:0)
如果您乐于使用第三方库,则可以使用熊猫。 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']}