我是Python3.3的新手,我想从列表中删除重复成员,我在网上找到了这个简短的代码,但我不知道这段代码背后的逻辑是什么? ,尤其是“not seen_add(x)”部分!。
def f7(seq):
seen=set()
seen_add=seen.add
return[x for x in seq if x not in seen and not seen_add(x)]
有人可以为我解决这个问题吗?!
答案 0 :(得分:2)
集合的add
方法始终返回None
。在布尔上下文中,None
被视为false,因此not seen_add(x)
始终为True
。 and
短路,因此seen_add(x)
仅在x未按预期注册时执行。 seen_add(x)
用于跟踪现在已经看到x的事实,而不是过滤任何内容,这就是not seen_add(x)
始终为真的原因。
将列表理解转换为等效循环,我们有
def f7(seq):
seen=set()
seen_add=seen.add
result = []
for x in seq:
if x not in seen and not seen_add(x):
result.append(x)
return result
将and
转换为更易读的形式,并取消seen_add
微优化,您找到的代码等效于以下内容:
def f7(seq):
seen=set()
result = []
for x in seq:
if x not in seen:
seen.add(x)
result.append(x)
return result