如何将字典列表合并为一个字典?


123

我该如何列出这样的词典

[{'a':1}, {'b':2}, {'c':1}, {'d':2}]

变成这样的单个字典

{'a':1, 'b':2, 'c':1, 'd':2}


是的,尽管那会合并为列表的字典。
卡特里尔2010年

1
这是一个列表,而不是字典:>>> type([{'a':1},{'b':2}])<
type'list

考虑到它出现的频率,确实应该有一个班轮。为什么不支持{** d_list中的d}的原因?
markemus

Answers:


163

这适用于任何长度的字典:

>>> result = {}
>>> for d in L:
...    result.update(d)
... 
>>> result
{'a':1,'c':1,'b':2,'d':2}

作为一个理解

# Python >= 2.7
{k: v for d in L for k, v in d.items()}

# Python < 2.7
dict(pair for d in L for pair in d.items())


6
>>> L=[{'a': 1}, {'b': 2}, {'c': 1}, {'d': 2}]    
>>> dict(i.items()[0] for i in L)
{'a': 1, 'c': 1, 'b': 2, 'd': 2}

注意:“ b”和“ c”的顺序与您的输出不匹配,因为字典是无序的

如果字典可以具有多个键/值

>>> dict(j for i in L for j in i.items())

如果列表中的任何词典包含多个项目,则失败。
PaulMcG 2010年

2
咳嗽*(假设每本字典仅包含一个键值对)*咳嗽
Katriel 2010年

嗯,首先我发布了一种适用于一般命令的方法,但看起来OP不需要这种方法
John La Rooy

5

对于平面词典,您可以执行以下操作:

from functools import reduce
reduce(lambda a, b: dict(a, **b), list_of_dicts)

4

这类似于@delnan,但提供了修改k / v(键/值)项的选项,并且我认为它更具可读性:

new_dict = {k:v for list_item in list_of_dicts for (k,v) in list_item.items()}

例如,替换k / v元素,如下所示:

new_dict = {str(k).replace(" ","_"):v for list_item in list_of_dicts for (k,v) in list_item.items()}

将dict对象从列表中拉出后,从字典.items()生成器中解压缩k,v元组


2
dict1.update( dict2 )

这是不对称的,因为您需要选择对重复的密钥进行处理。在这种情况下,dict2将覆盖dict1。换另一种方式。

编辑:啊,对不起,没有看到。

可以在单个表达式中执行此操作:

>>> from itertools import chain
>>> dict( chain( *map( dict.items, theDicts ) ) )
{'a': 1, 'c': 1, 'b': 2, 'd': 2}

最后一点都不归功于我!

但是,我认为通过一个简单的for循环执行此操作可能更像Pythonic(显式>隐式,flat> nested)。YMMV。


1
它是一个列表,而不是字典:>>> type([{'a':1},{'b':2}])<
type'list



0
>>> dictlist = [{'a':1},{'b':2},{'c':1},{'d':2, 'e':3}]
>>> dict(kv for d in dictlist for kv in d.iteritems())
{'a': 1, 'c': 1, 'b': 2, 'e': 3, 'd': 2}
>>>

注意,我在最后一个字典中添加了第二个键/值对,以显示它可用于多个条目。此外,列表中较晚位置的字典中的键将覆盖较早版本中的字典相同的键。


-1

dic1 = {'Maria':12,'Paco':22,'Jose':23} dic2 = {'Patricia':25,'Marcos':22'Tomas':36}

dic2 = dict(dic1.items()+ dic2.items())

这将是结果:

dic2 {'Jose':23,'Marcos':22,'Patricia':25,'Tomas':36,'Paco':22,'Maria':12}

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.