我有一个清单清单
input = [[2,13],[5,3],[10,8],[13,4],[15,0],[17,10],[20,5],[25,9],[28,7],[31,0]]
我想写一个列表推导式,[a,b]
上面的对在哪里得到b > a
。在上述示例中,将为[2,13]
。
我的尝试
x = [[item[i],[j]] for item in inputArray if j>i]
产生一个 NameError
NameError: name 'j' is not defined`
你尝试的问题是,你永远不知道什么样的Pythoni
和j
应该是。没有这些信息,j > i
就无法计算检查,并且无法[item[i],[j]]
构建列表。
您可以发出
>>> inp = [[2,13],[5,3],[10,8],[13,4],[15,0],[17,10],[20,5],[25,9],[28,7],[31,0]]
>>> [[a, b] for a, b in inp if b > a]
[[2, 13]]
此解决方案不会产生,NameError
因为它for a, b in inp
告诉Python迭代inp
(两个元素的子列表)的元素,并在每次迭代中将名称分配给a
子列表的第一个元素,并将名称b
分配给第二个元素。
我使用该名称inp
而不是input
因为后者已经由内置函数获取用户输入。
列表理解的说明
理解等同于
>>> result = []
>>> for a, b in inp:
... if b > a:
... result.append([a, b])
...
>>> result
[[2, 13]]
中的每个两个元素列表inp
都解压缩到变量a
和中b
。如果过滤条件b > a
为True
,则会建立一个列表[a, b]
并将其包含在最终结果中。
如果您不想使用拆包,也可以inp
像这样在子列表中建立索引:
>>> [sub[:] for sub in inp if sub[1] > sub[0]]
[[2, 13]]
对sub
通孔进行完整切片可以sub[:]
确保像到目前为止介绍的其他解决方案一样,过滤后的结果存储(浅)的子列表的副本inp
。如果不需要复制,则可以省略[:]
。
这段代码不会产生,NameError
因为它for sub in inp
告诉Python进行迭代,inp
并在每次迭代中将名称分配给sub
下一个子列表。另外,显式数字(0
和1
)用于索引。
就个人而言,我更喜欢带包装的解决方案。即使的元素inp
不支持索引,它也更易于阅读并且可以运行,但是它们是可迭代的,可以从中提取两个元素。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句