Python 使用列表筛选两个元素子列表的列表
我有一份清单Python 使用列表筛选两个元素子列表的列表,python,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] 产生一个namererror NameError: name 'j' is not defined` 您尝试的
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]
产生一个namererror
NameError: name 'j' is not defined`
您尝试的问题是,您从未告诉Python应该是什么
i
和j
。无法计算检查j>i
,并且在没有该信息的情况下无法生成列表[项目[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]]
此解决方案不会产生namererror
,因为inp中的对于a,b告诉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
子列表的(浅层)副本。如果不需要复制,可以省略[:]
此代码不会产生namererror
,因为inp中的for sub
告诉Python在inp
上迭代,并在每次迭代中将名称sub
分配给下一个子列表。此外,索引使用显式数字(0
和1
)
就个人而言,我更喜欢解包的解决方案。即使inp
的元素不支持索引,它也更容易阅读和运行,但它是可从中提取两个元素的可编辑项。您应该将每对元素解压到i
,j
变量中,然后您可以比较它们:
x = [[i, j] for i,j in inputList if j > i]
(注意我已重命名了输入阵列
,输入列表
)
或不开箱:
x = [item for item in inputList if item[1] > item[0]]
非常感谢。解释和编辑我的文章。下次我会问这样的问题。