python - 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
)?它在哪里指定并且可以查阅完整的语义?或者它只是一个未记录的实现行为,不值得依赖?
解决方案
这里没有任何“增量”发生。在字典理解完成之前,海象运算符不会分配给变量。if x not in d
指的是原始的空字典,而不是您使用推导式构建的字典,就像具有列表推导式的版本指的是原始的l
.
过滤掉重复项的原因仅仅是因为字典键总是唯一的。试图创建一个重复的键只会忽略第二个。就像你写的一样:
return {2: None, 2: None}
你会得到{2: None}
。
所以你的功能可以简化为
def purge2(a):
return list({x: None for x in a})
推荐阅读
- java - 如何在 Android Studio 中创建 Fuseki SPARQL 服务器连接
- javascript - 如何在组中使用 keydown 事件?
- ibm-datapower - 响应类型“通过”按预期工作,但是当我将其更改为“XML”时,只有 GET 请求有效
- java - 将对象写入 ObjectOutputStream 不起作用
- xml - XSLT 使用 & 字符验证 CDATA
- server - CF:如何获取调用者 IP 或主机名?
- java - connection.createStruct 使字符串为空
- android - 开始新的意图,然后打开一个特定的片段
- python-3.x - 如何让一个圆圈在窗口中反弹?
- bison - 如何修复解析简单 shell 命令的顺序?