我尝试总结两个这样的字典:
my_new_dict = dict(my_existing_dict.items() + my_new_dict.items())
但收到错误
TypeError: unsupported operand type(s) for +: 'dict_items' and 'dict_items'
我做错了什么?
我尝试总结两个这样的字典:
my_new_dict = dict(my_existing_dict.items() + my_new_dict.items())
但收到错误
TypeError: unsupported operand type(s) for +: 'dict_items' and 'dict_items'
我做错了什么?
从 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
,您的方法将在其中起作用。
在 python3 中,dict.items()
返回一个类型dict_items
显然无法添加的对象。(在 python 2 中,它返回一个list
可以添加的)。
添加一对适用于 py2k 和 py3k 的字典的另一种方法:
d = dict1.copy()
d.update(dict2)
当然,在发生键冲突的情况下,您希望发生的事情有些模棱两可。例如,如果两个 dicts 都有key1
,key1
应该在输出中保留谁?或者你应该使用它们两个值的某种组合?在后一种情况下,您可能需要collections
模块中的某些内容(defaultdict
或者Counter
)
其他建议答案的另一种方法是:
dict(list(d1.items()) + list(d2.items()))
d1
如果和中都存在键,则 ind2
的值d2
将用于最终字典。