列表理解中的动态自引用条件

va0*_*a01 9 python conditional loops list-comprehension list

目标:在列表理解中创建一个条件语句,它 (1)动态测试——即,在每次迭代时——如果元素不在给定的列表中,则给定 (2) 列表本身在每次迭代时更新。

后台代码:

arr = [2, 2, 4]
l = list()
Run Code Online (Sandbox Code Playgroud)

期望的输出:

l = [2, 4]
Run Code Online (Sandbox Code Playgroud)

通过 for 循环所需的行为:

for element in arr:
        if element not in l:
            l.append(element)
Run Code Online (Sandbox Code Playgroud)

不正确的列表理解不会产生所需的行为:

l = [element for element in arr if element not in l]
Run Code Online (Sandbox Code Playgroud)

问题重申:如何修复列表理解以生成所需的行为,即上述所需的输出?

Mad*_*ist 4

如果您绝对必须使用列表推导,您可以将for循环重新转换为一个。缺点是您最终会得到一个None元素列表,因为这就是list.append返回的内容:

>>> arr = [2, 2, 4]
>>> l = list()
>>> _ = [l.append(element) for element in arr if element not in l]
>>> print(l)
[2, 4]
>>> print(_)
[None, None]
Run Code Online (Sandbox Code Playgroud)

如果您与推导式相关,但不一定与列表推导式相关,则可以使用@tdelaney 建议的生成器推导式。这不会产生任何不需要的副产品,并且将完全按照您的要求进行。

>>> arr = [2, 2, 4]
>>> l = list()
>>> l.extend(element for element in arr if element not in l)
Run Code Online (Sandbox Code Playgroud)

比这两种方法更好的方法可能是将原始列表放入集合中,然后放回到列表中。使用集合来扩展列表的优点是,在检查先前的包含之后,集合添加元素的速度要快得多。每次添加元素时,列表都必须进行线性搜索并重新分配。

>>> l = list(set(arr))
Run Code Online (Sandbox Code Playgroud)