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

时间:2018-10-14 11:04:54

标签: python

我有一个列表列表

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`

2 个答案:

答案 0 :(得分:1)

尝试的问题在于,您从未告诉Python ij应该是什么。没有这些信息,就无法计算支票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的元素(两个元素的子列表),并在每次迭代中分配名称{{1} }到子列表的第一个元素,名称a到第二个元素。

我使用名称b代替了inp,因为内置功能已经采用了input来获取用户输入。

列表理解的说明

理解力等同于

>>> result = []
>>> for a, b in inp:
...     if b > a:
...         result.append([a, b])
... 
>>> result
[[2, 13]]

inp中的每个二元素列表都被解压缩到变量ab中。如果过滤条件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的元素不支持索引,它也更易于阅读并且可以运行,但是它们是可迭代的,可以从中提取两个元素。

答案 1 :(得分:1)

您应该将每对分解成requesti变量,然后可以进行比较:

j

(请注意,我已将x = [[i, j] for i,j in inputList if j > i] inputArray重命名)


或者不打开包装:

inputList