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

时间:2019-04-21 06:49:41

标签: python python-3.x

我只想从列表中删除0

>>> mylist = [0, 1, None, 2, False, 1, 0]

所有人都漏掉了假物品

>>> 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]

所需的输出:

[1, None, 2, False, 1]

感谢您的帮助。

4 个答案:

答案 0 :(得分:7)

Python boolint的子类,而False类似于0。因此按相等进行比较不会产生所需的输出。

您可以使用(请注意,这是最不推荐的,并且您最好不要使用):

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

您应该使用什么:

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

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

我个人不喜欢filterlambda,而是使用列表理解,这证明了更快的速度:

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

答案 1 :(得分:1)

还可以检查x的数据类型,然后使用!=运算符。

# works for integer 0
[x for x in mylist if type(x) != int or x != 0] 
# works for float 0.0 as well
[x for x in mylist if (type(x) != int and type(x) != float) or x != 0]

答案 2 :(得分:0)

类型boolint的子类型,因此False转换为0。我认为一种解决方案是对数字进行字符串化和过滤。这里也给出了更好的答案:

list(filter(lambda x: str(x) != '0', mylist)) 

答案 3 :(得分:-1)

x is not 0方法有效,但可能不是最佳方法。通过使用list comprehension而不是使用对list()filter()的调用来提高速度。

在Jupyter笔记本中运行此程序,并利用内置的%timeit魔术来查看它们各自返回结果的速度。

mylist = [0, 1, None, 2, False, 1, 0]

使用list()和filter()

%timeit list(filter(lambda x: x is not 0, mylist))
**1.12 µs** ± 17.7 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

使用列表理解

%timeit [i for i in mylist if i is not 0]
**411 ns** ± 8.42 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

我们看到列表理解技术明显更快。