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

新手上路,请多包涵

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

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

但收到错误

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

我做错了什么?

原文由 JohnDow 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 766
2 个回答

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

添加一对适用于 py2k 和 py3k 的字典的替代方法:

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

当然,在键冲突的情况下,您希望发生的事情有些含糊不清。例如,如果两个字典都有 key1 ,其 key1 应该保留在输出中?或者你应该使用它们两个值的某种组合?在后一种情况下,您可能需要 collections 模块( defaultdictCounter

原文由 mgilson 发布,翻译遵循 CC BY-SA 3.0 许可协议

从 Python 3.9(特别是 PEP 584 )开始,dicts 获得联合( | )和更新( |= )操作就像集合一样,因此成为实现的“一个真正的方法”你在找什么。

 d1 | d2

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

 {**d1, **d2}

这是将两个词典解压到一个新词典中,从而形成一个联合。

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

在字典中,后面的值总是会覆盖前面的值

如果你想要相反的行为,你可以简单地交换文字中字典的顺序。

您的方法不起作用,因为 字典视图是 set-like ,因此它们没有实现加法。

您可能想要的是 联合d1.items() | d2.items() ,它将为您提供一组 (key, value) 的元组。如果您随后将它传递给 dict() 并且存在重复项,则将使用“最后”值,但是集合(与视图本身不同)是无序的,因此无法保证哪个项目将结束在组合组中“第一”,这意味着哪个“获胜”将是任意的。

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

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

在 Python 2 中, dict.items() 只返回一个 list ,您的方法将在其中起作用。

原文由 Gareth Latty 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题