32

我尝试总结两个这样的字典:

my_new_dict = dict(my_existing_dict.items() + my_new_dict.items())

但收到错误

TypeError: unsupported operand type(s) for +: 'dict_items' and 'dict_items'

我做错了什么?

4

3 回答 3

52

从 Python 3.9(尤其是PEP 584)开始,dicts 像集合一样获得 union ( |) 和 update ( |=) 操作,因此这成为实现您正在寻找的“一种真正的方式”。

d1 | d2

该 PEP 列出了早期 Python 版本中可用的其他选项,这些选项都有其缺点。如果您达到PEP 448 (Python 3.5),我建议您使用:

{**d1, **d2}

这是将两个字典解包成一个新字典,从而形成一个联合。

一个问题是你想要的行为是模棱两可的——字典不能有重复的键,所以如果两者都包含相同的键,你想发生什么就不清楚了。该规范明确说明了使用此方法时应该发生的情况:

在字典中,后面的值总是会覆盖前面的

如果您想要相反的行为,您可以简单地交换文字中字典的顺序。

您的方法不起作用,因为字典视图是 set-like,因此它们没有实现添加。

您可能想要的是union : d1.items() | d2.items(),它将为您提供一组(key, value). 如果然后将其传递给dict()并且有重复项,则“最后一个”值将是使用的值,但是集合(与视图本身不同)是无序的,因此不能保证哪个项目最终会在组合中“第一个”设置,这意味着一个“获胜”将是任意的。

因此,简而言之,只要订单/重复选择不重要:

dict(d1.items() | d2.items())

在 Python 2 中,dict.items()只需返回 a list,您的方法将在其中起作用。

于 2012-11-13T13:28:08.507 回答
29

在 python3 中,dict.items()返回一个类型dict_items显然无法添加的对象。(在 python 2 中,它返回一个list可以添加的)。

添加一对适用于 py2k 和 py3k 的字典的另一种方法:

d = dict1.copy()
d.update(dict2)

当然,在发生键冲突的情况下,您希望发生的事情有些模棱两可。例如,如果两个 dicts 都有key1key1应该在输出中保留谁?或者你应该使用它们两个值的某种组合?在后一种情况下,您可能需要collections模块中的某些内容(defaultdict或者Counter

于 2012-11-13T13:28:18.843 回答
14

其他建议答案的另一种方法是:

dict(list(d1.items()) + list(d2.items()))

d1如果和中都存在键,则 ind2的值d2将用于最终字典。

于 2018-11-19T14:19:38.917 回答