Chr*_*del 2 python python-3.x set-comprehension
这实际上是关于集合理解的语义的问题,但我首先需要解释上下文.我正在尝试创建一组新的元组,其中touple中的配对值是唯一的,无论对中的值的顺序如何.简化我的实际程序,我所拥有的是类似的{(1, 2), (2, 1), (3, 4)},我想得到的{(1, 2), (3, 4)}
我尝试过这样的事情:
oldSet = {(1, 2), (2, 1), (3, 4)}
newSet = set()
newSet = {(val1, val2) for (val1, val2) in oldSet if not (val2, val1) in newSet}
Run Code Online (Sandbox Code Playgroud)
然而,newSet就是{(1, 2), (2, 1), (3, 4)},这意味着什么是错我的条件表达式.我对理解的理解表明,以上是这样的语法糖:
newSet = set()
for (val1, val2) in oldSet:
if not (val2, val1) in newSet:
newSet.add((val1, val2))
Run Code Online (Sandbox Code Playgroud)
这种传统的循环结构工程(newSet是{(1, 2), (3, 4)}).是否存在导致条件在newSet任何成员之前被评估的理解?我对Python很新,所以我想知道是否有一些我想念的微妙内容.
谢谢!
你误会了; 集合理解是一种独特的表达,与作业分开.该表达式生成一个新 set()对象,然后将其分配给您newSet,替换set()您拥有的旧对象.
因此,当您迭代并构建集合时,set()绑定的前一个和单独的对象newSet 保持为空.实际上,集合理解是这样的:
newSet = set()
_result = set()
for (val1, val2) in oldSet:
if not (val2, val1) in newSet:
result.add((val1, val2))
newSet = _result
Run Code Online (Sandbox Code Playgroud)
您可以在迭代时使用副作用来更改单独的集:
seen = set()
newSet = {(val1, val2) for (val1, val2) in oldSet
if not ((val2, val1) in seen or seen.add((val1, val2))}
Run Code Online (Sandbox Code Playgroud)
这用于seen跟踪已处理的内容,如果两个条件都为真,则包含元组:
seen.add()元组的操作返回false值.因为seen.add()总是回归None,所以情况总是如此.请注意,现在这两次构建相同的集合,因此您也可以执行常规循环并完成它:
newSet = set()
for (val1, val2) in oldSet:
if not (val2, val1) in newSet:
newSet.add((val1, val2))
Run Code Online (Sandbox Code Playgroud)
由于你的元组只包含两个值,你可以在这里使用排序; (a, b), (b, a)毕竟,任何一对元组都有一个独特的排序:
newSet = {tuple(sorted(t)) for t in oldSet}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
56 次 |
| 最近记录: |