如果有重复键,python dict理解总是"最后胜利"

use*_*066 9 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?
Run Code Online (Sandbox Code Playgroud)

wim*_*wim 10

我能保证最后一项会出现在最终词典中吗?

不完全是...

在重复键的情况下,保留第一个键,并保留最后一个值。结果(键、值)可能不存在于任何原始对中。

>>> {1.: 1, 1: 1.}
{1.0: 1.0}
Run Code Online (Sandbox Code Playgroud)

此行为在字典显示下有所记录(强调我的):

这意味着您可以在键/数据列表中多次指定相同的键,并且该键的最终字典值将是最后一个给出的值。


use*_*ica 8

最后一项获胜.我能找到的最好的文档是Python 3语言参考,第6.2.7节:

与list和set comprehensions相反,dict理解需要两个用冒号分隔的表达式,后跟通常的"for"和"if"子句.运行理解时,生成的键和值元素将按照生成的顺序插入到新字典.

该文档还明确指出最后一项赢得逗号分隔的键值对({1: 1, 1: 2})和字典解包({**{1: 1}, **{1: 2}}):

如果给出了逗号分隔的键/数据对序列,...您可以在键/基准列表中多次指定相同的键,并且该键的最终字典值将是给定的最后一个.

双星号**表示字典解包.它的操作数必须是映射.每个映射项都添加到新字典中.后面的值替换先前由键/数据对和早期字典解包设置的值.


Jon*_*sky 5

如果你的意思是类似

{key: val for (key, val) in pairs}
Run Code Online (Sandbox Code Playgroud)

其中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}
Run Code Online (Sandbox Code Playgroud)