此问题已在此处有答案:
How do I merge two dictionaries in a single expression in Python?(43答案)
7天前关闭
我试着这样总结两本字典:
my_new_dict = dict(my_existing_dict.items() + my_new_dict.items())
但接收错误
TypeError: unsupported operand type(s) for +: 'dict_items' and 'dict_items'
我做错了什么?
4条答案
按热度按时间p1iqtdky1#
Python 39(特别是PEP 584),dicts就像集合一样获得union(
|
)和update(|=
)操作,因此这成为实现您正在寻找的“一种真正的方法”。该PEP列出了早期Python版本中可用的其他选项,这些选项都有其缺点。如果你已经达到PEP 448(Python 3.5),我会推荐使用:
这是将两个字典解包成一个新的字典,从而产生一个联合。
一个问题是你想要的行为是模糊的-字典不能有重复的键,所以不清楚如果两个都包含相同的键,你想要发生什么。规范明确说明了使用此方法时应该发生的情况:
在字典中,后面的值总是覆盖前面的值
如果你想要相反的行为,你可以简单地交换字典在字面量中的顺序。
你的方法不起作用,因为字典视图是类似集合的,所以它们没有实现加法。
你可能想要的是工会:
d1.items() | d2.items()
,它将给予你一组(key, value)
的元组。如果你把它传递给dict()
,并且有重复的,“最后”的值将是使用的值,但是集合(不像视图本身)是无序的,所以不能保证哪一个项目将在组合集合中结束“第一”,这意味着哪一个“获胜”将是任意的。所以,简而言之,只要顺序/重复选择不重要:
在Python 2中,
dict.items()
只是返回一个list
,你的方法将在这里工作。jm81lzqq2#
在python3中,
dict.items()
返回一个类型为dict_items
的对象,显然不能添加。(在python 2中,它返回了一个list
,可以添加)。另一种方法是添加一对适用于py2k和py3k的字典:
当然,在密钥冲突的情况下,您希望发生的情况有些模糊。例如,如果两个dicts都有
key1
,那么应该在输出中保留哪个key1
?或者你应该使用它们两个值的某种组合?在后一种情况下,您可能需要collections
模块(defaultdict
或Counter
)中的某些内容。wvyml7n53#
另一个建议答案的方法是:
dict(list(d1.items()) + list(d2.items()))
如果
d1
和d2
中都有键,则d2
中的值将用于最终字典。yx2lnoni4#
我很惊讶没有人提到
ChainMap
。来自文档:
它通常比创建一个新字典和运行多个update()调用要快得多。
如果这很重要的话,它也会保持秩序。