如果我创建一个带有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?
答案 0 :(得分:8)
最后一项获胜。我能找到的最好的文档是Python 3 language reference, section 6.2.7:
与list和set comprehensions相反,dict理解需要两个用冒号分隔的表达式,后跟通常的“for”和“if”子句。运行理解时,生成的键和值元素将按照生成的顺序插入新词典中。
该文档还明确声明最后一项赢得逗号分隔的键值对({1: 1, 1: 2}
)和字典解包({**{1: 1}, **{1: 2}}
):
如果给出了以逗号分隔的键/数据对序列,...您可以在键/基准列表中多次指定相同的键,并且该键的最终字典值将是给定的最后一个。
双星号
**
表示字典解包。它的操作数必须是映射。每个映射项都添加到新字典中。后面的值替换先前由键/数据对和早期字典解包设置的值。
答案 1 :(得分:2)
我保证最后一个项目会出现在最终字典中吗?
不完全是...
如果键重复,则保留第一个键,并保留最后一个值。产生的 item (键,值)可能根本没有出现在任何原始对中。
>>> {1.: 1, 1: 1.}
{1.0: 1.0}
此行为在Dictionary displays(强调我的)下有所记录:
这意味着您可以在键/基准列表中多次指定相同的键,并且该键的最终词典的值将是给出的最后一个。
答案 2 :(得分:1)
如果你的意思是
{key: val for (key, val) in pairs}
其中pairs
是2元素列表或元组的有序集合(例如,列表或元组),然后是,理解将按顺序采集集合,最后一个值将“获胜”。
请注意,如果对是一组对,则没有“最后一项”,因此结果是不可预测的。 实施例:
>>> n = 10
>>> pairs = [("a", i) for i in range(n)]
>>> {key:val for (key, val) in pairs}
{'a': 9}
>>> {key:val for (key, val) in set(pairs)}
{'a': 2}