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

Joh*_*Dow 20 python python-3.x

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

my_new_dict = dict(my_existing_dict.items() + my_new_dict.items())
Run Code Online (Sandbox Code Playgroud)

但收到错误

TypeError: unsupported operand type(s) for +: 'dict_items' and 'dict_items'
Run Code Online (Sandbox Code Playgroud)

我做错了什么?

Gar*_*tty 31

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

{**d1, **d2}
Run Code Online (Sandbox Code Playgroud)

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

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

在词典中,后面的值将始终覆盖先前的值

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

dict(**d1, **d2)
Run Code Online (Sandbox Code Playgroud)

在旧版本的Python 3中,您的方法是有效的,但这里的问题是字典视图是类似设置的,因此它们没有实现添加.

你可能想要的是union : d1.items() | d2.items(),它将为你提供一组元组(key, value).如果你然后将它传递给dict()并且有重复,那么"last"值将是所使用的值,但是set(与视图本身不同)是无序的,因此无法保证哪个项目最终会在"组合"中结束设置,意味着哪一个"胜利"将是任意的.

所以,简而言之,只要订单不重要:

dict(d1.items() | d2.items())
Run Code Online (Sandbox Code Playgroud)

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

  • 当我尝试这个时,我得到:`TypeError:unhashable type:'dict'` (6认同)

mgi*_*son 25

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

另一种添加一对可在py2k和py3k上运行的字典的方法:

d = dict1.copy()
d.update(dict2)
Run Code Online (Sandbox Code Playgroud)

当然,在关键碰撞的情况下,你想要发生什么有些含糊不清.例如,如果两个dicts都有key1,key1哪个应该保留在输出中?或者你应该使用他们两个值的某种组合?在后一种情况下,你可能会想从什么collections模块(或defaultdictCounter)


erw*_*man 10

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

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

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