关于python:使用大于或小于运算符比较两个列表

Comparing two lists using the greater than or less than operator

我注意到最近有一段代码直接比较了两个整数列表,如下所示:

1
2
3
4
a = [10,3,5, ...]
b = [5,4,3, ...,]
if a > b:
     ...

这似乎有点奇怪,但我想如果所有list_a的元素都比list_b大,它会返回True;如果每个元素都相等,或者list_b的元素比list_a大,它会返回false。所以我测试了它:

1
2
3
4
5
6
>>> a=[3,3,3,3]
>>> b=[4,4,4,4]
>>> a>b
False
>>> b>a
True

好的。同样:

1
2
3
4
5
6
>>> b = [1,1,1,1]
>>> a = [1,1,1,1]
>>> a>b
False
>>> b>a
False

但当它变得更模糊时:

1
2
3
4
5
6
>>> a=[1,1,3,1]
>>> b=[1,3,1,1]
>>> a>b
False
>>> b>a
True

或:

1
2
3
4
5
6
>>> a=[1,3,1,1]
>>> b=[1,1,3,3]
>>> a>b
True
>>> b>a
False

结果有点奇怪。Python到底在做什么?似乎它返回的结果是第一个列表,其中最左边的元素大于对应的元素?


通过比较python教程中的序列和其他类型:

The comparison uses lexicographical ordering: first the first two items are compared, and if they differ this determines the outcome of the comparison; if they are equal, the next two items are compared, and so on, until either sequence is exhausted.

另请参见维基百科有关词典编纂顺序的文章。


由于我一开始没有发现用"词典编纂顺序"来解释列表/元组比较,因此这里尝试用"我自己的话"来解释它。首先,下面的解释中引用了一些示例列表:

1
2
3
4
5
6
a = [1, 2, 3]
b = [1, 2, 10]
c = [1, 2, 3, 100]
d = [1, 2, 3]
e = [1, 2, 3, 4, 'a']
f = ['a', 'b', 'c']

依次比较每个索引处的一对项。因此,将ab进行比较将导致11进行比较,22进行比较,310进行比较。

当找到一对不相等的项或(如果列表的长度不同)到达较短列表的结尾时,将停止对的比较。

例如,当比较ab时,比较将在比较310时停止。比较bc时,比较103时停止比较。

一旦发现不相等项对,总的结果就是比较不相等项的结果。这适用于列表长度是否相同——例如,列表b大于列表c,因为c中的100从未起作用。

例如,当比较ab时,总的结果将是比较310的结果。由于3小于10,所以a < b -> Truea > b -> False,因为3不大于10。因为3不等于10

如果其中一个列表较短,其n个项目等于较长列表的前n个项目,如ac,则较短的列表将被视为小于较长的列表(因此a小于c)。

只有当两个列表的长度相同且所有项对的比较结果相同时,两个列表才会进行相等的比较。

关于类型的注意事项:如果一对中的项目不可比较,则与通常的TypeError比较将失败。例如,当将1'a'进行比较时,将列表af进行比较将失败。但也要注意,清单de可以比较,因为e中的'a'从未与d中的任何内容进行比较。