小能豆

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

py

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

有人能帮我解决这个问题吗?!


阅读 30

收藏
2024-12-03

共1个答案

小能豆

此代码是一种简洁的方法,可以从列表中删除重复项,同时保持元素的顺序。让我们分解一下:

def f7(seq):
    seen = set()  # This will store the unique elements we've encountered so far
    seen_add = seen.add  # A shorthand reference to the `add` method of the set (for performance reasons)

    # List comprehension to build a list of unique elements
    return [x for x in seq if x not in seen and not seen_add(x)]

以下是具体情况:

  1. seen = set():这将初始化一个空集,用于存储我们已经见过的元素。集合非常适合此目的,因为它仅存储唯一元素,并且检查成员资格(x in seen)非常快。
  2. seen_add = seen.addadd:这会创建对集合对象方法的引用,这样我们就可以调用它,seen_add(x)而不是seen.add(x)在列表推导中调用。这样可以略微提高性能,因为无需每次在列表推导中查找该方法。
  3. 列表理解
  4. x not in seen:检查元素是否x尚未在seen集合中。
  5. not seen_add(x):如果x不在集合中,则seen使用add方法来将其添加到 (这就是seen_add(x)使用 来代替 的地方seen.add(x))。
  6. 如果列表推导x尚未包含结果,则将其包含在结果中seen(从而确保唯一性并保持顺序)。

例子:

f7([1, 2, 2, 3, 4, 1, 5, 3])

输出:[1, 2, 3, 4, 5]

此函数删除重复项,同时保留元素的原始顺序。

2024-12-03