类型错误:不支持+的操作数类型:“dict-items”和“dict-items”

2024-04-25 06:12:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我试着把两本字典加起来:

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

但收到错误

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

我做错了什么?


Tags: andnewfor字典mytype错误items
3条回答

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

{**d1, **d2}

现在,您可以将解包提供为文字和多个解包,这意味着这是可行的。

一个问题是你想要的行为是模棱两可的-字典不能有重复的键,所以不清楚如果两者都包含相同的键,你想要发生什么。规范明确说明了使用此方法时应执行的操作:

In dictionaries, later values will always override earlier ones

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

dict(**d1, **d2)

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

您可能需要的是uniond1.items() | d2.items(),它将为您提供一组(key, value)元组。如果随后将其传递给dict()并且存在重复项,“last”值将是所使用的值,但是集合(与视图本身不同)是无序的,因此无法保证组合集合中的哪个项将以“first”结尾,这意味着哪个“wins”将是任意的。

因此,简言之,只要顺序/重复选择不重要:

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

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

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

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

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

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

添加一对适用于py2k和py3k的词典的另一种方法:

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

当然,在发生密钥冲突的情况下,您希望发生什么是有点模棱两可的。e、 g.如果两个dict都有key1,那么输出中应该保留谁的key1?或者你应该把两者结合起来?在后一种情况下,您可能需要来自collections模块的内容(或者defaultdict,或者Counter

相关问题 更多 >