python-3.x TypeError:不支持+的操作数类型:'dict_items'和'dict_items' [重复]

llew8vvj  于 2023-05-02  发布在  Python
关注(0)|答案(4)|浏览(135)

此问题已在此处有答案

How do I merge two dictionaries in a single expression in Python?(43答案)
7天前关闭
我试着这样总结两本字典:

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

但接收错误

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

我做错了什么?

p1iqtdky

p1iqtdky1#

Python 39(特别是PEP 584),dicts就像集合一样获得union(|)和update(|=)操作,因此这成为实现您正在寻找的“一种真正的方法”。

d1 | d2

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

{**d1, **d2}

这是将两个字典解包成一个新的字典,从而产生一个联合。
一个问题是你想要的行为是模糊的-字典不能有重复的键,所以不清楚如果两个都包含相同的键,你想要发生什么。规范明确说明了使用此方法时应该发生的情况:
在字典中,后面的值总是覆盖前面的值
如果你想要相反的行为,你可以简单地交换字典在字面量中的顺序。
你的方法不起作用,因为字典视图是类似集合的,所以它们没有实现加法。
你可能想要的是工会:d1.items() | d2.items(),它将给予你一组(key, value)的元组。如果你把它传递给dict(),并且有重复的,“最后”的值将是使用的值,但是集合(不像视图本身)是无序的,所以不能保证哪一个项目将在组合集合中结束“第一”,这意味着哪一个“获胜”将是任意的。
所以,简而言之,只要顺序/重复选择不重要:

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

在Python 2中,dict.items()只是返回一个list,你的方法将在这里工作。

jm81lzqq

jm81lzqq2#

在python3中,dict.items()返回一个类型为dict_items的对象,显然不能添加。(在python 2中,它返回了一个list,可以添加)。
另一种方法是添加一对适用于py2k和py3k的字典:

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

当然,在密钥冲突的情况下,您希望发生的情况有些模糊。例如,如果两个dicts都有key1,那么应该在输出中保留哪个key1?或者你应该使用它们两个值的某种组合?在后一种情况下,您可能需要collections模块(defaultdictCounter)中的某些内容。

wvyml7n5

wvyml7n53#

另一个建议答案的方法是:
dict(list(d1.items()) + list(d2.items()))
如果d1d2中都有键,则d2中的值将用于最终字典。

yx2lnoni

yx2lnoni4#

我很惊讶没有人提到ChainMap

from collections import ChainMap

dict1 = {'a': 1, 'b': 2}
dict2 = {'c': 3, 'd': 4}

combined = ChainMap(dict1, dict2)

print(combined['a']) # Output: 1
print(combined['c']) # Output: 3

来自文档:
它通常比创建一个新字典和运行多个update()调用要快得多。
如果这很重要的话,它也会保持秩序。

相关问题