Skip to main content
 首页 » 编程设计

python之如何将过滤功能应用于多个列表中的项目

2025年05月04日22lvdongjie

我想从多个(?)列表中获取值,不是 0(我认为 filter 可以是解决方案之一)。

列表如下:

>>ls = [[i for i in np.random.randint(0, 5, 5)] for _ in range(7)] 
>>ls 
>> 
[[2, 3, 3, 0, 0], 
 [4, 2, 4, 3, 2], 
 [1, 2, 4, 2, 4], 
 [2, 3, 4, 3, 1], 
 [0, 1, 0, 3, 0], 
 [3, 4, 4, 4, 3], 
 [3, 4, 3, 3, 2]] 

预期结果是:

[2,3,3,4,2,4,3,2,1,2,4,2,4,2,3,4,3,1,1,3,3,4,4,4,3,3,4,3,3,2] 

我尝试使用filter 函数,想扩展这个想法,但我失败了:

>> [elem for elem in filter(lambda x: x if x != 0 else False, ls[0])] 
>>  
[2, 3, 3] 

我想找到获得预期结果的最快方法,而不是使用 for 循环。 你有什么好的建议吗?

编辑:

糟糕,很抱歉让您感到困惑。 我说“不使用 for 循环”的意思是,我想使用列表理解而不是 for 循环,因为我听说列表理解比 for 循环 更有效。

请您参考如下方法:

使用嵌套列表理解:

[j for i in ls for j in i if j != 0] 

ls = [[i for i in np.random.randint(0, 5, 5)] for _ in range(7)] 
 
[[1, 0, 3, 0, 0], 
 [1, 2, 2, 3, 0], 
 [1, 1, 1, 4, 3], 
 [1, 0, 3, 0, 4], 
 [2, 0, 3, 0, 2], 
 [1, 0, 4, 4, 0], 
 [2, 4, 1, 1, 2]] 
 
[j for i in ls for j in i if j != 0] 
# [1, 3, 1, 2, 2, 3, 1, 1, 1, 4, 3, 1, 3, 4, 2, 3, 2, 1, 4, 4, 2, 4, 1, 1, 2] 

如果你想避免任何显式循环,这里有一个使用itertools.chain的选项。和过滤器:

from itertools import chain 
 
list(filter(lambda x: x != 0, chain(*ls))) 
# [1, 3, 1, 2, 2, 3, 1, 1, 1, 4, 3, 1, 3, 4, 2, 3, 2, 1, 4, 4, 2, 4, 1, 1, 2] 

看起来您也在使用 NumPy 来创建列表。请注意,使用 np.nonzero 会更简单、更有效。 :

import numpy as np 
a = np.random.randint(0, 5, (7,5)) 
a[np.nonzero(a)] 
# [1, 3, 1, 2, 2, 3, 1, 1, 1, 4, 3, 1, 3, 4, 2, 3, 2, 1, 4, 4, 2, 4, 1, 1, 2]