使用列表理解过滤包含两个元素的子列表的列表

Python_newbie

我有一个清单清单

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`
提格布

你尝试的问题是,你永远不知道什么样的Pythonij应该是。没有这些信息,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 > aTrue,则会建立一个列表[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下一个子列表。另外,显式数字(01)用于索引。

就个人而言,我更喜欢带包装的解决方案。即使的元素inp不支持索引,它也更易于阅读并且可以运行,但是它们是可迭代的,可以从中提取两个元素。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章