我只想从列表中删除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]
感谢您的帮助。
答案 0 :(得分:7)
Python bool
是int
的子类,而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]
我个人不喜欢filter
和lambda
,而是使用列表理解,这证明了更快的速度:
>>> [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)
类型bool
是int
的子类型,因此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)
我们看到列表理解技术明显更快。