如何从python列表中删除仅零位数字?

azz*_*msa 4 python python-3.x

我只想0从清单中删除:

>>> mylist = [0, 1, None, 2, False, 1, 0]
Run Code Online (Sandbox Code Playgroud)

他们都缺少假物品

>>> list(filter(lambda x: x != 0, mylist))
[1, None, 2, 1]  # missing False

>>> list(filter(lambda x: x != 0 and x is not type(int), mylist))
[1, None, 2, 1] # missing False

>>> list(filter(lambda x: x != 0 and x is not type(False), mylist))
[1, None, 2, 1]

>>> list(filter(lambda x: x != 0 and x is not False, mylist))
[1, None, 2, 1]
Run Code Online (Sandbox Code Playgroud)

所需的输出:

[1, None, 2, False, 1]
Run Code Online (Sandbox Code Playgroud)

谢谢您的帮助。

Aus*_*tin 7

Python bool是0的子类,int并且False类似于0。因此,按相等进行比较不会产生所需的输出。

您可以使用(请注意,这是最不推荐使用的,理想情况下您不应使用):

>>> list(filter(lambda x: x is not 0, mylist))
[1, None, 2, False, 1]
Run Code Online (Sandbox Code Playgroud)

您应该使用什么:

正如评论中所讨论的,身份检查可能无法在所有情况下进行。一种更可行的方法是将相等检查与类型检查一起使用为:

>>> list(filter(lambda x: x != 0 or isinstance(x, bool), mylist))
[1, None, 2, False, 1]
Run Code Online (Sandbox Code Playgroud)

就个人而言,不是filterand 的忠实拥护者lambda,我会使用列表综合,它证明了更快:

>>> [x for x in mylist if x != 0 or isinstance(x, bool)]
[1, None, 2, False, 1]
Run Code Online (Sandbox Code Playgroud)