TypeError:+:'dict_items'和'dict_items'的不支持的操作数类型

时间:2012-11-13 13:25:57

标签: python python-3.x

我试着总结两个这样的词典:

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

但收到错误

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

我做错了什么?

3 个答案:

答案 0 :(得分:23)

PEP 448(Python 3.5)以来,我推荐一个非常简单易读的解决方案:

{**d1, **d2}

您现在可以在文字和多个拆包中提供拆包,这意味着可行。

一个问题是你想要的行为是不明确的 - 词典不能有重复的键,所以如果两个键都包含相同的键,则不清楚你想要发生什么。该规范明确指出使用此方法时应该发生什么:

  

在词典中,以后的值将始终覆盖之前的值

如果您想要反向行为,您可以简单地在文字中交换字典的顺序。如果要抛出异常,可以使用不接受重复参数的dict()方法,即:

dict(**d1, **d2)

在旧版本的Python 3中,您的方法是有效的,但此处的问题是dictionary views are set-like,因此它们没有实现添加。

您可能想要的是uniond1.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模块中的内容(defaultdictCounter

答案 2 :(得分:2)

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

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

如果d1d2中都存在键,则d2中的值将在最终字典中使用。