我想从列表列表中筛选元素,并使用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)来写,但这不是重点,假设这些不是数字而是任意元素,我想把它们的值赋给变量名。
你可以这样做
使用解构语法。
通过给lambda一个元组作为参数,可以显式地命名子列表元素(假设它们的数量总是固定的):
如果像您试图指定的那样指定“lambda i,j,k”,则表示lambda将接收三个参数。但是filter会给lambda一次一个子列表的每个元素,也就是说,one。通过将参数括在括号中,您可以说lambda将收到一个参数,但是您还可以命名它的每个组件。
使用
lambda
和filter
有点傻,因为我们有其他可用的技术。在这种情况下,我可能会用这种方法(或使用等效的生成器表达式)来解决特定的问题
或者,如果我需要解包,比如
如果我真的需要一个函数,我可以使用参数元组解包(这在Python 3.x中被删除了,顺便说一下,因为人们不怎么使用它):
lambda (x, y, z): x + y + z
接受一个元组并解包它的三个项,分别是x
、y
和z
。(注意,您也可以在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]
)。相关问题 更多 >
编程相关推荐