如果不删除0值,则从列表中删除无值

时间:2013-04-19 03:31:28

标签: python list filter nonetype

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值?

13 个答案:

答案 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复杂性。了解数据和运行时用例,以及对程序进行概要分析,可以从密集型操作或大型数据开始。

在常见情况下选择任何一种方法都无关紧要。它变得更像是符号的偏好。实际上,在那些不常见的情况下,numpycython可能是值得的替代方案,而不是尝试对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)