Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/grails/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用列表筛选两个元素子列表的列表_Python - Fatal编程技术网

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]]

非常感谢。解释和编辑我的文章。下次我会问这样的问题。