Python 3 - 列表理解“如果不在列表中”

Posted

技术标签:

【中文标题】Python 3 - 列表理解“如果不在列表中”【英文标题】:Python 3 - list comprehension "if not in list" 【发布时间】:2020-08-03 03:56:14 【问题描述】:

我有一个 list1 包含不同的整数。 现在,我想创建第二个列表 (list2),它包含 list1 的所有元素,没有双精度。而且我想用列表理解创建 list2,而无需先将其定义为空列表:

list1 = [3,3,2,1,5,6,1,5,7]
list2 = [i for i in list1 if i not in list2]
print(list2)

我知道,这种情况对于 set() 来说是完美的。 但为什么它不适用于列表理解?

在我发现的这些线程中,我的 list2-syntax 应该没问题:

Python List Comprehension and 'not in' List comprehension with if statement

两个投票最多的答案都建议使用类似的语法

[y for y in a if y not in b]

【问题讨论】:

简单 - 列表理解评估之前分配给list2 所以无法通过列表理解来解决这种情况?那么我的情况和投票最多的答案中建议的语法有什么区别呢? 这将抛出NameError,因为在评估列表理解时list2 不存在。更一般地说,您不能在列表推导中引用结果列表,列表推导和其他推导构造不是“单行 for 循环”,您不应该这样认为它们。它们用于表达导致新容器或可迭代的映射/过滤操作。 这能回答你的问题吗? Removes duplicates from nested list without use of set 【参考方案1】:

这是因为您以自引用方式定义 list2 的内容。 虽然在语法上它是正确的,但在语义上它是没有意义的 - 当您在列表理解的过滤器/保护部分中引用它时,还没有定义 list2。

【讨论】:

这里问了一个类似的问题:***.com/questions/2638478/… 当我在使用列表推导之前定义list2时,list2中仍然存在双重元素:list1 = [3,3,2,1,5,6,1,5,7] list2 = [ i for i in list1 if i not in list2] print(list2) @laura.neukamp 当然,因为创建另一个列表对象不会修改 list2,为什么会这样?同样,列表推导式是描述映射/过滤操作以生成新列表对象的声明性构造 @juanpa.arrivillaga:是的!现在我明白了!这是非常合乎逻辑和清晰的。谢谢你的解释。【参考方案2】:

我不是 100% 确定,但我相信在理解完成之前,该列表还没有完全填充。

如果你不能使用列表理解,你可以简单地这样做

List(Set(list1))

另一种选择(也不是你想要的)

list1 = [3,3,2,1,5,6,1,5,7]
list2 = []
for itm in list1:
    if itm not in list2:
        list2.append(itm)

【讨论】:

当然,我知道。但是我想了解为什么无法以我的意图方式进行列表理解? 您检查它是否包含在 list2 中,但我相信 list2 尚未填充,直到理解完成。 连同@juanpa.arrivillaga 的答案,这就是解决方案。现在我明白了我的问题和我的思维错误。应该永远记住编写我理解并且可以阅读的代码。谢谢刘易斯·莫里斯! 如果对你有帮助,别忘了接受答案:)

以上是关于Python 3 - 列表理解“如果不在列表中”的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI:如果不在列表中,NavigationLink 不起作用

如果不在列表中,则 MS 访问将项目添加到组合框

如何使用 python 列表理解/字典将每一列打印为唯一变量

[引用数组的多个值时,使用Python列表理解排除重复项

使用列表理解 Python 创建新列

Python Pandas 滚动聚合一列列表