gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 08:26:56 25 4
gpt4 key购买 nike

我想从多个(?)列表中获取值,不是 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]

关于python - 如何将过滤功能应用于多个列表中的项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56218186/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com