这是我一开始的资料。
我的清单
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值?
这是我一开始的资料。
我的清单
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值?
当前回答
列表理解可能是最干净的方式:
>>> 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]
其他回答
>>> 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的情况下调整过滤器来实现这一点,(我不建议使用此代码-仅用于科学目的)
>>> 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]
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))
列表理解可能是最干净的方式:
>>> 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]
迭代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)(从这里开始))或cython可能是值得的替代方案,而不是尝试微管理Python优化。