假设我有一个字典列表,如下所示:
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}
Run Code Online (Sandbox Code Playgroud)
我想采取这些并构建一个像这样的大词典:
big_dict:
{'key_a': [valuex1, valuey1, valuez1],
'key_b': [valuex2, valuey2, valuez2],
'key_c': [valuex3, valuey3, valuez3]}
Run Code Online (Sandbox Code Playgroud)
有没有优雅的" 拉链 "式方式让我这样做?
所有的键总是相同的.
我总是可以迭代每个键上的键并构建一个新的列表字典,但这似乎非常类似于python.
Ned*_*der 10
big_dict = {}
for k in dicts[0]:
big_dict[k] = [d[k] for d in dicts]
Run Code Online (Sandbox Code Playgroud)
(我改名为你dict自己的dictsdict是内置的,而且dicts更有意义.)
或者,通过词典理解:
{ k:[d[k] for d in dicts] for k in dicts[0] }
Run Code Online (Sandbox Code Playgroud)
或者,对于Python <2.7:
dict((k, [d[k] for d in dicts]) for k in dicts[0])
Run Code Online (Sandbox Code Playgroud)
您可以使用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)
Run Code Online (Sandbox Code Playgroud)
结果:
print(d)
defaultdict(list,
{'key_a': ['valuex1', 'valuey1', 'valuez1'],
'key_b': ['valuex2', 'valuey2', 'valuez2'],
'key_c': ['valuex3', 'valuey3', 'valuez3']})
Run Code Online (Sandbox Code Playgroud)