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

mon*_*top 226 python list filter nonetype

这是我开始的源头.

我的列表

L = [0, 23, 234, 89, None, 0, 35, 9]
Run Code Online (Sandbox Code Playgroud)

当我运行这个:

L = filter(None, L)
Run Code Online (Sandbox Code Playgroud)

我得到了这个结果

[23, 234, 89, 35, 9]
Run Code Online (Sandbox Code Playgroud)

但这不是我需要的,我真正需要的是:

[0, 23, 234, 89, 0, 35, 9]
Run Code Online (Sandbox Code Playgroud)

因为我正在计算数据的百分位数而且0会产生很大的差异.

如何在不删除0值的情况下从列表中删除None值?

jam*_*lak 318

>>> 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]
Run Code Online (Sandbox Code Playgroud)

只是为了好玩,这里是你如何适应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]
Run Code Online (Sandbox Code Playgroud)

  • 不太优雅的`过滤器`版本:`过滤器(lambda x:x不是None,L)` - 你可以使用`partial`和`operator.is_not`摆脱`lambda`我认为,但它可能不是值得一提,因为list-comp更加清晰. (19认同)
  • @mgilson哦哇我甚至都不知道`is_not`存在!我以为它只是'is_`,我只是为了好玩而添加它 (3认同)

Ray*_*ger 122

FWIW,Python 3使这个问题变得简单:

>>> L = [0, 23, 234, 89, None, 0, 35, 9]
>>> list(filter(None.__ne__, L))
[0, 23, 234, 89, 0, 35, 9]
Run Code Online (Sandbox Code Playgroud)

在Python 2中,您将使用列表推导:

>>> [x for x in L if x is not None]
[0, 23, 234, 89, 0, 35, 9]
Run Code Online (Sandbox Code Playgroud)

  • 什么是`__ne__`? (11认同)
  • @DrMcCleod表达式``x!= y``在内部调用``x .__ ne __(y)``,其中*ne*代表"不相等".因此,``None .__ ne__``是一个绑定方法,当使用*None*以外的任何值调用时返回*True*.例如,用``bm(10)``调用``bm = None .__ ne__``返回*NotImplemented*作为真值,``bm(None)``返回*False*. (9认同)
  • 考虑使用 [`operator`](https://docs.python.org/3.4/library/operator.html) 模块。 (2认同)

Too*_*eve 16

对于Python 2.7(参见Raymond的回答,相当于Python 3):

想要知道"不是无"的东西在python(和其他OO语言)中是如此常见,在我的Common.py中(我使用"来自Common import*"导入每个模块),我包括以下这些行:

def exists(it):
    return (it is not None)
Run Code Online (Sandbox Code Playgroud)

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

filter(exists, L)
Run Code Online (Sandbox Code Playgroud)

我觉得这比相应的列表理解更容易阅读(Raymond表示,作为他的Python 2版本).


Dot*_*tPi 13

使用列表理解可以按如下方式完成:

l = [i for i in my_list if i is not None]
Run Code Online (Sandbox Code Playgroud)

l的值是:

[0, 23, 234, 89, 0, 35, 9]
Run Code Online (Sandbox Code Playgroud)

  • 此解决方案已在最佳答案中找到,还是我遗漏了什么? (3认同)

A T*_*A T 10

@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]
Run Code Online (Sandbox Code Playgroud)

  • @jamylak - 我确实读过它,但你没有包含这个解决方案。- 也不确定您为什么要编辑 4-5 年前人们的答案。 (2认同)

Kev*_*vin 5

迭代空间,使用可能是一个问题.在不同情况下,分析可能显示为"更快"和/或"更少内存"密集.

# 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, ...]
Run Code Online (Sandbox Code Playgroud)

一种方法(也由@jamylak,@ Raymond Hettinger@Dipto建议)在内存中创建一个重复列表,对于包含少量None条目的大型列表来说这可能是昂贵的.

第二个方法经过列表一次,然后再次每次直至None到达.这可能会减少内存密集,并且列表会随着时间的推移而变小.列表大小的减少可能会加速None前面的大量条目,但最糟糕的情况是如果None后面有很多条目.

并行化和就地技术是其他方法,但每种方法在Python中都有其自身的复杂性.了解数据和运行时用例以及对程序进行概要分析是从密集型操作或大型数据开始的地方.

在常见情况下,选择任何一种方法都可能无关紧要.它变得更像是符号的偏好.事实上,在那些不常见的情况下,numpy或者cython可能是值得的替代品,而不是试图微观管理Python优化.

  • 根本不喜欢这个,您声称此解决方案的全部优点是该列表可能**如此巨大**,以至于在内存中构建重复列表可能成本高昂。那么你的解决方案将**更加昂贵**,因为你要扫描整个列表中的“L.count(None)”,然后多次调用“.remove(None)”,这使得这个“O” (N^2)` 您试图解决的情况不应该以这种方式处理,如果数据是内存密集型的,则应该将数据重组到数据库或文件中。 (2认同)

the*_*der 5

假设列表如下所示

iterator = [None, 1, 2, 0, '', None, False, {}, (), []]
Run Code Online (Sandbox Code Playgroud)

这将仅返回那些其bool(item) is True

print filter(lambda item: item, iterator)
# [1, 2]
Run Code Online (Sandbox Code Playgroud)

这相当于

print [item for item in iterator if item]
Run Code Online (Sandbox Code Playgroud)

仅过滤“无”:

print filter(lambda item: item is not None, iterator)
# [1, 2, 0, '', False, {}, (), []]
Run Code Online (Sandbox Code Playgroud)

相当于:

print [item for item in iterator if item is not None]
Run Code Online (Sandbox Code Playgroud)

获取所有计算结果为 False 的项目

print filter(lambda item: not item, iterator)
# Will print [None, '', 0, None, False, {}, (), []]
Run Code Online (Sandbox Code Playgroud)