Сравнение двух списков с использованием оператора больше или меньше - программирование
Подтвердить что ты не робот

Сравнение двух списков с использованием оператора больше или меньше

Недавно я заметил часть кода, непосредственно сравнивающую два списка целых чисел:

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

который казался немного странным, но я предположил, что он вернет True, если все элементы list_a больше, чем list_b и False, если каждый элемент равен или list_b больше элементов, чем list_a " s. Поэтому я протестировал его:

>>> 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? Кажется, что он возвращает результат в пользу первого списка, в котором самый левый элемент больше, чем соответствующий?

4b9b3361

Ответ 1

Из сравнения последовательностей и других типов в учебнике Python:

Сравнение использует лексикографическое упорядочение: сначала сравниваются первые два элемента, и если они отличаются друг от друга, это определяет результат сравнения; если они равны, сравниваются следующие два элемента и так далее, пока не будет исчерпана любая последовательность.

См. Также статью в Википедии о лексикографическом порядке.

Ответ 2

Так как я не нашел объяснения сравнения списка/кортежа, используя, в первую очередь, "лексикографическое упорядочение", в первую очередь освещающее его, вот попытка объяснить это "своими словами". Во-первых, вот несколько примеров списков, о которых говорится в объяснении ниже:

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

Пара элементов по каждому индексу сравнивается по очереди. Таким образом, сравнение a с b приведет к сравнению 1, 2 с 2, а 3 сравнивается с 10.

Сравнение пар остановится, если найдена неравная пара элементов или - если списки имеют разные длины - достигнут конец более короткого списка.

Например, при сравнении a и b сравнения будут останавливаться при сравнении 3 и 10. При сравнении b и c сравнения будут останавливаться при сравнении 10 и 3.

Как только обнаружена неравная пара, общий результат - результат сравнения неравных предметов. Это относится к тому, являются ли списки одинаковой длины или нет - например, список b больше, чем список c, потому что 100 in c никогда не запускается.

Например, при сравнении a с b общий результат будет результатом сравнения 3 с 10. a < b -> True, потому что 3 меньше 10. a > b -> False, потому что 3 не больше 10. a == b -> False, потому что 3 не равно 10.

Если один из списков короче и его N элементов равны первым N элементам более длинного списка, как в случае с a и c, более короткий список будет считаться меньшим, чем более длинный список (поэтому a меньше c).

Два списка будут сравниваться как равные, только если они одинаковой длины, а все пары элементов сравниваются как равные.

Примечание о типах: если элементы в паре не сопоставимы, сравнение будет происходить с использованием TypeError, как обычно. Например, сравнение списка a с f не удастся, если 1 будет сравниваться с 'a'. Но также обратите внимание, что списки d и e можно сравнить, поскольку 'a' in e никогда не сравнивается ни с чем в d.