我有一个列表列表
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`
答案 0 :(得分:1)
尝试的问题在于,您从未告诉Python i
和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
的元素(两个元素的子列表),并在每次迭代中分配名称{{1} }到子列表的第一个元素,名称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
的元素不支持索引,它也更易于阅读并且可以运行,但是它们是可迭代的,可以从中提取两个元素。
答案 1 :(得分:1)
您应该将每对分解成request
,i
变量,然后可以进行比较:
j
(请注意,我已将x = [[i, j] for i,j in inputList if j > i]
,inputArray
重命名)
或者不打开包装:
inputList