从列表中删除 Nothing 值而不删除0值

这是我的线人。

我的名单

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

315113 次浏览
>>> 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]

只是为了好玩,这里是你如何在不使用lambda的情况下调整filter来做这件事的方法,(我不推荐这个代码-这只是出于科学目的)

>>> from operator import is_not
>>> from functools import partial
>>> L = [0, 23, 234, 89, None, 0, 35, 9]
>>> list(filter(partial(is_not, None), L))
[0, 23, 234, 89, 0, 35, 9]

使用列表理解可以做到如下:

l = [i for i in my_list if i is not None]

l的值为:

[0, 23, 234, 89, 0, 35, 9]

列表理解可能是最干净的方式:

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

还有一个函数式编程方法,但它更复杂:

>>> from operator import is_not
>>> from functools import partial
>>> L = [0, 23, 234, 89, None, 0, 35, 9]
>>> list(filter(partial(is_not, None), L))
[0, 23, 234, 89, 0, 35, 9]

对于Python 2.7(参见Raymond的回答,Python 3的等效内容):

想知道一些“不是None”的东西在python(和其他OO语言)中是否如此常见,所以在我的common .py(我用“from common import *”导入到每个模块中)中,我包含了这些行:

def exists(it):
return (it is not None)

然后从列表中删除None元素,只需执行以下操作:

filter(exists, L)

我发现这比对应的列表理解式(Raymond在Python 2版本中展示的)更容易阅读。

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

迭代 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(例如,如果L是numpy。array: L = L[L != numpy.array(None) (from here))或cython可能是值得的替代方案,而不是尝试微管理Python优化。

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

假设列表如下

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]

只过滤None:

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, {}, (), []]

如果这都是列表的列表,你可以修改sir @Raymond的答案

L = [[None], [123], [None], [151]] no_none_val = list(filter(无。__ne__, [x[0] for x in L])) 对于python 2,但是

no_none_val = [x[0] for x in L if x[0] not None] """ Both返回[123,151]""" "

.

& lt; & lt;如果变量不是List中的变量,则list_index [0]

L = [0, 23, 234, 89, None, 0, 35, 9]
result = list(filter(lambda x: x is not None, L))

如果列表中有NoneType和pandas._lib .missing. list。NAType对象比使用:

[i for i in lst if pd.notnull(i)]