python set方法中的“not x”如何工作?

时间:2013-12-03 09:29:35

标签: python python-3.x

我是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)]

有人可以为我解决这个问题吗?!

1 个答案:

答案 0 :(得分:2)

集合的add方法始终返回None。在布尔上下文中,None被视为false,因此not seen_add(x)始终为Trueand短路,因此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