首页 > 解决方案 > dict 理解是否在 Python 中增量评估?

问题描述

我会假设以下代码的结果purge和结果purge2相同(删除重复元素,保留第一次出现的元素及其顺序):

def purge(a):
    l = []
    return (l := [x for x in a if x not in l])
def purge2(a):
    d = {}
    return list(d := {x: None for x in a if x not in d})
t = [2,5,3,7,2,6,2,5,2,1,7]
print(purge(t), purge2(t))

但它看起来像dict推导式,不像列表,值d是增量构建的。这是实际发生的事情吗?我是否dict从这个示例代码中正确推断出理解的语义以及它们与list理解的区别?它是否仅适用于理解,或者也适用于指代被分配到的字典的其他右侧(例如,嵌套在其他表达式中的理解,涉及迭代器的东西,类型以外的理解dict)?它在哪里指定并且可以查阅完整的语义?或者它只是一个未记录的实现行为,不值得依赖?

标签: pythondictionaryvariable-assignmentdictionary-comprehension

解决方案


这里没有任何“增量”发生。在字典理解完成之前,海象运算符不会分配给变量。if x not in d指的是原始的空字典,而不是您使用推导式构建的字典,就像具有列表推导式的版本指的是原始的l.

过滤掉重复项的原因仅仅是因为字典键总是唯一的。试图创建一个重复的键只会忽略第二个。就像你写的一样:

return {2: None, 2: None}

你会得到{2: None}

所以你的功能可以简化为

def purge2(a):
    return list({x: None for x in a})

推荐阅读