我试着总结两个这样的字典:
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 许可协议
我试着总结两个这样的字典:
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 许可协议
从 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 许可协议
4 回答4.4k 阅读✓ 已解决
4 回答3.8k 阅读✓ 已解决
1 回答3k 阅读✓ 已解决
3 回答2.1k 阅读✓ 已解决
1 回答4.5k 阅读✓ 已解决
1 回答3.8k 阅读✓ 已解决
1 回答2.8k 阅读✓ 已解决
在 python3 中,
dict.items()
返回类型为dict_items
的对象,显然无法添加。 (在 python 2 中,它返回一个list
可以添加)。添加一对适用于 py2k 和 py3k 的字典的替代方法:
当然,在键冲突的情况下,您希望发生的事情有些含糊不清。例如,如果两个字典都有
key1
,其key1
应该保留在输出中?或者你应该使用它们两个值的某种组合?在后一种情况下,您可能需要collections
模块(defaultdict
或Counter
)