我试着总结两个这样的词典:
my_new_dict = dict(my_existing_dict.items() + my_new_dict.items())
但收到错误
TypeError: unsupported operand type(s) for +: 'dict_items' and 'dict_items'
我做错了什么?
答案 0 :(得分:23)
自PEP 448(Python 3.5)以来,我推荐一个非常简单易读的解决方案:
{**d1, **d2}
您现在可以在文字和多个拆包中提供拆包,这意味着可行。
一个问题是你想要的行为是不明确的 - 词典不能有重复的键,所以如果两个键都包含相同的键,则不清楚你想要发生什么。该规范明确指出使用此方法时应该发生什么:
在词典中,以后的值将始终覆盖之前的值
如果您想要反向行为,您可以简单地在文字中交换字典的顺序。如果要抛出异常,可以使用不接受重复参数的dict()
方法,即:
dict(**d1, **d2)
在旧版本的Python 3中,您的方法是有效的,但此处的问题是dictionary views are set-like,因此它们没有实现添加。
您可能想要的是union:d1.items() | d2.items()
,它会为您提供一组(key, value)
元组。如果你然后将它传递给dict()
并且有重复项,那么“last”值将是使用的值,但是set(与视图本身不同)是无序的,因此无法保证哪个项目最终会“首先“在组合集中,意味着哪一个”获胜“将是任意的。
因此,简而言之,只要订单/重复选择不重要:
dict(d1.items() | d2.items())
请注意,在Python 2中,dict.items()
只返回list
,您的方法可以在其中使用。
答案 1 :(得分:22)
在python3中,dict.items()
返回类型为dict_items
的对象,显然无法添加。 (在python 2中,它返回了一个list
,可以添加)。
添加一对可在py2k和py3k上运行的字典的另一种方法:
d = dict1.copy()
d.update(dict2)
当然,在关键碰撞的情况下,你想要发生的事情有些含糊不清。例如如果两个dicts都有key1
,其key1
应保留在输出中?或者你应该使用他们两个值的某种组合?在后一种情况下,您可能需要collections
模块中的内容(defaultdict
或Counter
)
答案 2 :(得分:2)
对其他建议答案的另一种方法是:
dict(list(d1.items()) + list(d2.items()))
如果d1
和d2
中都存在键,则d2
中的值将在最终字典中使用。