从Python的列表中筛选元素?

2024-05-15 02:38:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我想从列表列表中筛选元素,并使用lambda遍历每个元素的元素。例如,给定列表:

a = [[1,2,3],[4,5,6]]

假设我只想保留列表和大于N的元素,我试着写:

filter(lambda x, y, z: x + y + z >= N, a)

但我得到了错误:

 <lambda>() takes exactly 3 arguments (1 given)

如何在将每个元素的值赋给x、y和z时进行迭代?类似于zip,但用于任意长的列表。

谢谢

另外,我知道我可以用:filter(lambda x:sum(x)…,a)来写,但这不是重点,假设这些不是数字而是任意元素,我想把它们的值赋给变量名。


Tags: lambda元素重点列表错误数字zipfilter
3条回答

你可以这样做

>>> a=[[1,2,3],[4,5,6]]
>>> filter(lambda (x,y,z),: x+y+z>6, a)
[[4, 5, 6]]

使用解构语法。

通过给lambda一个元组作为参数,可以显式地命名子列表元素(假设它们的数量总是固定的):

>>> a = [[1,2,3],[4,5,6]]
>>> N = 10
>>> filter(lambda (i, j, k): i + j + k > N, a)
[[4, 5, 6]]

如果像您试图指定的那样指定“lambda i,j,k”,则表示lambda将接收三个参数。但是filter会给lambda一次一个子列表的每个元素,也就是说,one。通过将参数括在括号中,您可以说lambda将收到一个参数,但是您还可以命名它的每个组件。

使用lambdafilter有点傻,因为我们有其他可用的技术。

在这种情况下,我可能会用这种方法(或使用等效的生成器表达式)来解决特定的问题

>>> a = [[1, 2, 3], [4, 5, 6]]
>>> [item for item in a if sum(item) > 10]
[[4, 5, 6]]

或者,如果我需要解包,比如

>>> [(x, y, z) for x, y, z in a if (x + y) ** z > 30]
[(4, 5, 6)]

如果我真的需要一个函数,我可以使用参数元组解包(这在Python 3.x中被删除了,顺便说一下,因为人们不怎么使用它):lambda (x, y, z): x + y + z接受一个元组并解包它的三个项,分别是xyz。(注意,您也可以在def中使用它,即:def f((x, y, z)): return x + y + z。)

当然,您可以在所有版本的Python中使用赋值方式解包(def f(item): x, y, z = item; return x + y + z)和索引(lambda item: item[0] + item[1] + item[2])。

相关问题 更多 >

    热门问题