如果我用dict理解创建了一个python字典,但是有重复的键,我是否保证最后一项将是最终字典中的最后一项?从https://www.python.org/dev/peps/pep-0274/看不清楚吗?
new_dict = {k:v for k,v in [(1,100),(2,200),(3,300),(1,111)]} new_dict[1] #is this guaranteed to be 111, rather than 100?
密钥的最后一个值获胜。我可以找到的最佳文档在Python 3语言参考的第6.2.7节中:
与list和set的理解相反,dict的理解需要两个表达式之间用冒号分隔,后跟通常的“ for”和“ if”子句。运行理解时,将生成的键和值元素 按它们产生的顺序 插入新字典 中 。
该文档还明确指出,最后一项对于逗号分隔的键/值对({1: 1, 1: 2})和字典解包({**{1: 1}, **{1: 2}})都是有效的:
{1: 1, 1: 2}
{**{1: 1}, **{1: 2}}
如果给出了以逗号分隔的键/基准对序列,则…您可以在键/基准列表中多次指定相同的键,并且该键的最终字典值将是最后给出的值。 双星号**表示 字典解包 。它的操作数必须是一个映射。每个映射项都添加到新词典中。较新的值将替换较早的键/基准对和较早的字典解包已设置的值。
如果给出了以逗号分隔的键/基准对序列,则…您可以在键/基准列表中多次指定相同的键,并且该键的最终字典值将是最后给出的值。
双星号**表示 字典解包 。它的操作数必须是一个映射。每个映射项都添加到新词典中。较新的值将替换较早的键/基准对和较早的字典解包已设置的值。
**
请注意,正如wim所指出的,如果有相同但不同的键,则第一个键的版本将获胜:
>>> {k: v for k, v in [(1, 1), (1.0, 2.0)]} {1: 2.0}
在这里,最终字典的键来自(1, 1),但值来自(1.0, 2.0)。
(1, 1)
(1.0, 2.0)