46

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

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

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

>>> a=[3,3,3,3]
>>> b=[4,4,4,4]
>>> a>b
False
>>> b>a
True

好的,这行得通。就像这样:

>>> b = [1,1,1,1]
>>> a = [1,1,1,1]
>>> a>b
False
>>> b>a
False

但是当它变得更加模糊时:

>>> a=[1,1,3,1]
>>> b=[1,3,1,1]
>>> a>b
False
>>> b>a
True

或者:

>>> a=[1,3,1,1]
>>> b=[1,1,3,3]
>>> a>b
True
>>> b>a
False

结果有点奇怪。python实际上在做什么?似乎它返回的结果有利于第一个列表,其中最左边的元素大于对应的?

4

3 回答 3

55

来自Python 教程中的比较序列和其他类型:

比较使用字典顺序:首先比较前两项,如果它们不同,则确定比较的结果;如果它们相等,则比较接下来的两项,依此类推,直到任一序列用完。

另请参阅有关字典顺序的 Wikipedia 文章。

于 2012-10-24T15:54:27.593 回答
18

由于我一开始并没有发现使用“字典顺序”进行列表/元组比较的解释特别有启发性,因此这里尝试“用我自己的话”来解释它。首先,这里有一些示例列表,在下面的解释中提到:

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导致1被比较12被比较2,和3被比较10

当发现不相等的项目对- 如果列表长度不同 - 到达较短列表的末尾时,对的比较将停止。

例如,当比较a和时,比较将在比较和b时停止。比较和时,比较将在比较和时停止。310bc103

一旦找到不相等的对,整体结果就是比较不相等的项目的结果。无论列表的长度是否相同,这都适用——例如,列表b大于列表c,因为100inc永远不会发挥作用。

例如,与 比较ab,整体结果将是与 比较的3结果10a < b -> True因为3小于10a > b -> False因为3不大于10a == b -> False因为3不等于10

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

只有当两个列表的长度相同并且所有成对的项目比较相等时,它们才会比较相等

关于类型的注意事项:如果一对中的项目不可比较,则比较将TypeError像往常一样失败。例如,与 比较时,比较 list toaf失败。但还要注意,列表和可以进行比较,因为in永远不会与 in 中的任何内容进行比较。1'a'de'a'ed

于 2017-11-17T03:19:57.177 回答
0

The given answers don't account for duplicates in the larger list, you can iterate over the bigger list and slice it each time to compare it with the sub list, this will maintain the order as well as account for duplicates.

This code would work:

def check_sublist(List,Sublist)
    for i in range(len(List)):
        if List[i:] ==Sublist:
            return True
    return False

Yes this is not time efficient but this is the only solution I could think since using set() would not maintain the order

于 2021-09-25T00:47:59.430 回答