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,y和z.(注意,你也可以使用它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将接收一个参数,但你也在命名它的每个组件.
| 归档时间: |
|
| 查看次数: |
33446 次 |
| 最近记录: |