从Python列表中过滤元素?

9 python list-comprehension list

我想从列表列表中过滤元素,并使用lambda迭代每个元素的元素.例如,给定列表:

a = [[1,2,3],[4,5,6]]
Run Code Online (Sandbox Code Playgroud)

假设我只想保留列表总和大于N的元素.我尝试写:

filter(lambda x, y, z: x + y + z >= N, a)
Run Code Online (Sandbox Code Playgroud)

但我得到错误:

 <lambda>() takes exactly 3 arguments (1 given)
Run Code Online (Sandbox Code Playgroud)

如何在将每个元素的值分配给x,y和z时进行迭代?像zip这样的东西,但对于任意长的列表.

谢谢,

ps我知道我可以使用:filter(lambda x:sum(x)...,a)来写这个,但这不是重点,想象这些不是数字而是任意元素,我想将它们的值赋给变量名.

Mik*_*ham 35

当我们有其他技术可用时,使用lambdawith filter有点傻.

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

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

或者,如果我需要打开包装,就像

>>> [(x, y, z) for x, y, z in a if (x + y) ** z > 30]
[(4, 5, 6)]
Run Code Online (Sandbox Code Playgroud)

如果我真的需要一个功能,我可以使用参数元组拆包(这是在Python 3.x中删除,顺便说一下,因为人不太多使用它):lambda (x, y, z): x + y + z需要一个元组,并解压缩它的三个项目,如x,yz.(注意,你也可以使用它def,即:def f((x, y, z)): return x + y + z.)

当然,您可以在所有Python版本中使用赋值样式unpacking(def f(item): x, y, z = item; return x + y + z)和indexing(lambda item: item[0] + item[1] + item[2]).


rbp*_*rbp 10

您可以通过给lambda一个元组作为其参数来明确命名子列表元素(假设它们总是固定数量):

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

如果您按照尝试指定"lambda i,j,k",则表示lambda将接收三个参数.但是过滤器会给lambda的每个元素,即一次一个子列表(因此你得到的错误).通过将括号中的参数括在lambda中,你说lambda将接收一个参数,但你也在命名它的每个组件.