Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从列表中删除None值而不删除0值_Python_List_Filter_List Comprehension_Nonetype - Fatal编程技术网

Python 从列表中删除None值而不删除0值

Python 从列表中删除None值而不删除0值,python,list,filter,list-comprehension,nonetype,Python,List,Filter,List Comprehension,Nonetype,我的名单 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产生了很大的差异 如何从列表中删除None值而不删除0值 >>> L = [0, 23, 234, 89, None, 0, 35, 9] >&

我的名单

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产生了很大的差异

如何从列表中删除None值而不删除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]
为了好玩,这里介绍了如何调整
过滤器来实现这一点,而无需使用
lambda
,(我不推荐使用此代码-这只是出于科学目的)


使用列表理解,可按如下方式进行:

l = [i for i in my_list if i is not None]
l的值为:

[0, 23, 234, 89, 0, 35, 9]
A可能是最干净的方式:

>>> 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]
对于Python2.7(参见Raymond的答案,对于Python3的等效版本):

想要知道在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]

迭代空间相比,使用可能是一个问题。在不同的情况下,评测可能会显示为“更快”和/或“更少的内存”密集型

# 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, ...]
first方法(如和所建议)在内存中创建一个重复列表,对于一个包含少量
条目的大型列表,这可能会占用大量内存

second方法对列表进行一次检查,然后每次检查一次,直到到达
None
。这可能会减少内存占用,而且随着时间的推移,列表会越来越小。列表大小的减小可能会加快前面大量
None
条目的速度,但最糟糕的情况是如果后面有大量
None
条目

第二种方法可能总是比第一种方法慢。这并不意味着它是无效的对价

并行化和就地技术是其他方法,但在Python中它们都有自己的复杂性。了解数据和运行时用例,以及分析程序是密集操作或大数据的起点


在一般情况下,选择哪种方法都可能无关紧要。它更像是一种符号的偏好。事实上,在这些不常见的情况下,
numpy
(例如,如果L是numpy.array:
L=L[L!=numpy.array(None)
())或
cython
)可能是值得的替代方案,而不是尝试微观管理Python优化

iterator = [None, 1, 2, 0, '', None, False, {}, (), []]
这将仅返回
bool(item)为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, {}, (), []]

如果全部都是列表,你可以修改@Raymond爵士的答案

L=[[None]、[123]、[None]、[151]]
no_none_val=列表(过滤器(无.__ne__[0]用于L中的x]))
但是对于Python2

no_none_val=[x[0]表示L中的x,如果x[0]不是none]
“”“两者都返回[123151]”

>

  • 我的列表:
    L=[0,23,234,89,无,0,35,9]
  • 代码结果:[k表示L中的k,如果(k为无)=False]
  • 结果:
    [0,23,234,89,0,35,9]
我认为使用filter()是最简单的方法:

res = list(filter(None, test_list))

不太优雅的
过滤器
版本:
过滤器(lambda x:x不是None,L)
--你可以用
部分
操作符去掉
lambda
。我想这不算,但这可能不值得,因为列表比较干净。@mgilson噢,哇,我甚至不知道
不存在!我以为它只是
是,我想把它加进去只是为了fun@jamylak”“是的“事实上,
不存在,
不存在,
不存在,
不存在,这让我很困扰。我真的认为
不存在
应该变成一种神奇的方法,
\u不包含
…看看我刚才问过的一个问题和我向回答者做的一个问题…但仍然觉得问题没有解决。@mgilson我也这么想。”umption我只是假设它不存在。我想你可以直接使用
filterfalse
或其他取决于用途的东西case@jamylak--是的。我的主要问题是,
x>y
并不意味着
不是x+1你建议像那样使用
\uuuuuu ne\uuuuuu
而不是
部分和
ne
吗?@jamylak是的,是的更快,更容易编写,更清晰。什么是
\uu__________
?@DrMcCleod表达式
x!=y
内部调用
x.\uu_____(y)
,其中ne代表“不相等”因此,
None.\uu______
是一个绑定方法,当使用非None的任何值调用时,该方法返回True。例如,
bm=None.\uu___
使用
bm(10)
调用时返回作为True值的NotImplemented,以及
bm(None)返回false。在布尔上下文中,<代码> NoTimpRimult<代码>真的很奇怪。请参见Python问题。请给OP提供一些详细信息,而不仅仅是代码。我做了。你怎么想?好,这不回答OP问题。请考虑这个答案:是的,你是对的。过滤器部分存在问题。你会更喜欢Python3的Raymonds解决方案,然后是Python2的列表理解。但是如果我必须走这条路,我宁愿
部分(不是,没有)
而不是这个解决方案。我相信这会更慢(虽然这不太重要)。但是有了一些Python模块的导入,就不需要自定义定义了
print filter(lambda item: not item, iterator)
# Will print [None, '', 0, None, False, {}, (), []]
L = [0, 23, 234, 89, None, 0, 35, 9] 
result = list(filter(lambda x: x != None, L))
res = list(filter(None, test_list))