如何在python中将字典与相同的键组合?

hid*_*de0 7 python dictionary

假设我有一个字典列表,如下所示:

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)

  • 只需添加一个详细信息,以避免在任何子词典没有所有键时出现 KeyError: {k: [d[k] for d in results if k in d.keys()] for k in results[0] } (3认同)

jpp*_*jpp 6

您可以使用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)