Answers:
>>> 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]
is_not
存在!我以为只是is_
,我只是为了好玩而补充一下
filterfalse
还是要视情况而定
x > y
这并不意味着not x <= y
python,因为您可以在__lt__
and中进行任何操作__le__
,所以为什么要x not in y
暗示not x in y
(尤其是因为not in
它拥有自己的字节码?)
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]
__ne__
like而不是partial
and ne
?
__ne__
啊
x != y
在内部调用x.__ne__(y)
其中的NE表示“不等于”。因此,None.__ne__
是一个绑定方法,当使用None以外的任何值调用该方法时,返回True。例如,使用with 返回NotImplemented作为真实值,并返回False。bm = None.__ne__
bm(10)
bm(None)
对于Python 2.7(请参阅Raymond的答案,对于Python 3等效):
想知道在Python(和其他OO语言)中是否普遍存在“不是None”的东西,以至于在我的Common.py(我使用“ from common import *”导入到每个模块)中,包括了以下几行:
def exists(it):
return (it is not None)
然后从列表中删除None元素,只需执行以下操作:
filter(exists, L)
我发现这比相应的列表理解(Raymond以他的Python 2版本显示)更容易阅读。
partial(is_not, None)
这种解决方案。我相信这会比较慢(尽管那不是太重要)。但是,通过导入几个python模块,在这种情况下无需自定义函数
@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]
[x for x in L if x is not None]
其他代码,只是我明确指出不推荐的其他内容
迭代与空间,使用可能是一个问题。在不同情况下,分析可能会显示“更快”和/或“更少的内存”密集型。
# 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优化进行微管理。
L.count(None)
,然后.remove(None)
多次调用,这将使O(N^2)
您无法解决正在尝试解决的问题,因此应该重组数据如果占用大量内存,则转入数据库或文件。
O(n^2)
仅当整个列表为时None
。
numpy
,能够以更优化的方式处理此类操作
numpy
最近几年一直在使用,但这是一项单独的技能。如果L
将其实例化为numpy.array
Python而不是Python list
,那么L = L[L != numpy.array(None)]
(stackoverflow.com/a/25255015/3003133)可能比任何一个都要好,但是我不知道下面处理与内存的实现细节。它至少会为掩码创建一个重复的布尔长度数组。这样,访问(索引)运算符内部比较的语法对我来说是新的。这个讨论也引起了我的注意dtype=object
。
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]
仅过滤无:
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, {}, (), []]
filter
版本:filter(lambda x: x is not None, L)
-你可以摆脱的lambda
使用partial
和operator.is_not
我想,但它可能是不值得的,因为名单-COMP是那么干净多了。