This was my source I started with.
我的清单
L = [0, 23, 234, 89, None, 0, 35, 9]
当我运行时:
L = filter(None, L)
我得到了这个结果
[23, 234, 89, 35, 9]
但这不是我需要的,我真正需要的是:
[0, 23, 234, 89, 0, 35, 9]
因为我正在计算数据的百分位数而且0会产生很大的差异。
如何在不删除0值的情况下从列表中删除None值?
答案 0 :(得分:294)
>>> L = [0, 23, 234, 89, None, 0, 35, 9]
>>> [x for x in L if x is not None]
[0, 23, 234, 89, 0, 35, 9]
只是为了好玩,以下是如何在不使用filter
的情况下调整lambda
来实现此目的,(我不建议使用此代码 - 仅用于科学目的)
>>> from operator import is_not
>>> from functools import partial
>>> L = [0, 23, 234, 89, None, 0, 35, 9]
>>> filter(partial(is_not, None), L)
[0, 23, 234, 89, 0, 35, 9]
答案 1 :(得分:112)
FWIW,Python 3使这个问题变得容易:
>>> L = [0, 23, 234, 89, None, 0, 35, 9]
>>> list(filter(None.__ne__, L))
[0, 23, 234, 89, 0, 35, 9]
在Python 2中,您将使用列表推导:
>>> [x for x in L if x is not None]
[0, 23, 234, 89, 0, 35, 9]
答案 2 :(得分:15)
对于Python 2.7(参见Raymond的回答,相当于Python 3):
想要知道某些东西“不是无”在python(和其他OO语言)中是如此常见,在我的Common.py中(我使用“来自Common import *”导入每个模块),我包括这些行:
def exists(it):
return (it is not None)
然后从列表中删除无元素,只需执行:
filter(exists, L)
我发现这比相应的列表理解更容易阅读(Raymond表示,作为他的Python 2版本)。
答案 3 :(得分:12)
使用列表理解可以按如下方式完成:
l = [i for i in my_list if i is not None]
l的值是:
[0, 23, 234, 89, 0, 35, 9]
答案 4 :(得分:9)
@jamylak的回答非常好,但是如果您不想导入几个模块来完成这个简单的任务,那么就自己编写lambda
:
>>> L = [0, 23, 234, 89, None, 0, 35, 9]
>>> filter(lambda v: v is not None, L)
[0, 23, 234, 89, 0, 35, 9]
答案 5 :(得分:5)
迭代 vs 空间,用法可能是一个问题。在不同情况下,分析可能显示为“更快”和/或“更少内存”密集。
# first
>>> L = [0, 23, 234, 89, None, 0, 35, 9, ...]
>>> [x for x in L if x is not None]
[0, 23, 234, 89, 0, 35, 9, ...]
# second
>>> L = [0, 23, 234, 89, None, 0, 35, 9]
>>> for i in range(L.count(None)): L.remove(None)
[0, 23, 234, 89, 0, 35, 9, ...]
第一个方法(也由@jamylak,@Raymond Hettinger和@Dipto建议)在内存中创建了一个重复的列表,这对于包含少量None
条目的大型列表。
第二次方法会在列表中进行一次,然后每次都会再次进入None
。这可能会减少内存密集,并且列表会随着时间的推移而变小。列表大小的减少可能会加快前面的大量None
条目,但最糟糕的情况是,如果后面有很多None
个条目。
并行化和就地技术是其他方法,但每种方法都有自己的Python复杂性。了解数据和运行时用例,以及对程序进行概要分析,可以从密集型操作或大型数据开始。
在常见情况下选择任何一种方法都无关紧要。它变得更像是符号的偏好。实际上,在那些不常见的情况下,numpy
或cython
可能是值得的替代方案,而不是尝试对Python优化进行微观管理。
答案 6 :(得分:2)
from operator import is_not
from functools import partial
filter_null = partial(filter, partial(is_not, None))
# A test case
L = [1, None, 2, None, 3]
L = list(filter_null(L))
答案 7 :(得分:2)
如果它都是列表清单,你可以修改先生@Raymond的回答
L = [ [None], [123], [None], [151] ]
no_none_val = list(filter(None.__ne__, [x[0] for x in L] ) )
但是对于python 2而言
no_none_val = [x[0] for x in L if x[0] is not None]
""" Both returns [123, 151]"""
<<如果变量不是None,则列表中的变量list_indice [0]为>>
答案 8 :(得分:1)
说清单如下
iterator = [None, 1, 2, 0, '', None, False, {}, (), []]
这将只返回bool(item) is True
print filter(lambda item: item, iterator)
# [1, 2]
这相当于
print [item for item in iterator if item]
只过滤无:
print filter(lambda item: item is not None, iterator)
# [1, 2, 0, '', False, {}, (), []]
相当于:
print [item for item in iterator if item is not None]
获取评估为False的所有项目
print filter(lambda item: not item, iterator)
# Will print [None, '', 0, None, False, {}, (), []]
答案 9 :(得分:1)
L = [0, 23, 234, 89, None, 0, 35, 9]
result = list(filter(lambda x: x != None, L))
答案 10 :(得分:0)
L=[0, 23, 234, 89, None, 0, 35, 9]
[k for k in L if (k is None)==False]
[0, 23, 234, 89, 0, 35, 9]
答案 11 :(得分:-1)
我认为使用 filter() 是最简单的方法:
res = list(filter(None, test_list))
答案 12 :(得分:-4)
此解决方案使用 而 而不是 :
value = None
while value in yourlist:
yourlist.remove(value)