是python dict理解总是"最后胜利"如果有重复的密钥

时间:2016-09-24 16:43:36

标签: python dictionary duplicates dictionary-comprehension

如果我创建一个带有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?

3 个答案:

答案 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}