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

时间:2016-03-30 15:23:47

标签: python list loops conditional list-comprehension

目标:在列表推导中创建条件语句,(1)动态测试 - 即,在每次迭代时 - 如果元素不在列表中被理解为给定(2)列表本身在每次迭代时都会更新。

背景代码:

arr = [2, 2, 4]
l = list()

期望的输出:

l = [2, 4]

for循环所需的行为:

for element in arr:
        if element not in l:
            l.append(element)

错误的列表理解会产生所需的行为:

l = [element for element in arr if element not in l]

问题重述:如何修复列表推导以使其生成所需的行为,即上述所需的输出?

2 个答案:

答案 0 :(得分:0)

如果您绝对必须使用列表复制,则可以将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]

如果你与理解联系在一起,但不一定要列出理解,你可以使用@tdelaney建议的生成器理解。这不会产生任何不需要的副产品,并且会完全符合您的要求。

>>> arr = [2, 2, 4]
>>> l = list()
>>> l.extend(element for element in arr if element not in l)

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

>>> l = list(set(arr))

答案 1 :(得分:0)

如果要删除重复项,为什么不使用 set 包含重复项的列表)或 list(dict.fromkeys 包含重复项的列表)?

但要回答您的问题:

我认为整个事情都是错误的,因为您的列表位于列表理解之内,所以l(您的列表)不会随着每次迭代而更新