Операторы неравенства Питона; сравнение списков

Возникают проблемы с пониманием поведения Python при использовании операторов неравенства для сравнения списков. Вот фрагмент кода, использующий интерпретатор командной строки python3:

>>> [8] < [7]
False
>>> [8] < [9]
True
>>> [8, 6] < [9]
True
>>> [8, 6] < [9, 7]     
True                    # So far so good
>>> [8, 6] < [9, 5]     
True                    # Huh?

Итак, ясно, что Python не просто перемещается по параллельным индексам. Я нашел некоторую информацию, которая говорит, что в этом сценарии Python упорядочивает списки "лексикографически", что, я думаю, означает в алфавитном порядке.

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

>>> [1, 2, 3] < [3, 2, 1]
True

Я предполагал, что внутреннее сравнение будет [1, 2, 3] <[1, 2, 3], что должно было вернуть False, поскольку 1 <1 - False, 2 <2 - False и т. Д.

Любая помощь приветствуется.

3 ответа

Решение

Это действительно имеет большой смысл.

Сравнение выполняется аналогично сортировке слов в лексикографическом порядке. Ведь слова тоже списки: списки персонажей.

Вы сначала рассмотрите первый пункт. Если один из них меньше, вся последовательность меньше, если они равны, вы переходите ко второму элементу и т. Д.

Ясно, что "86" предшествует "95", так же, как "az" предшествует "bc", а "100" предшествует "90".

Больше здесь.

Что делает Python, так это просто просматривает списки параллельно и сравнивает элементы одного и того же индекса. В первый раз, когда он сталкивается с элементами, которые не равны, он возвращает этот результат.

Это то же самое, что сравнивать слова:

"Peter" > "Peer"

Первые две буквы одинаковы, третья отличается и дает результат. Это (для списков) тот же метод, который используется в бумажном словаре, только с элементами списка вместо символов.

Дополнительная информация: (в соответствии с предложением Padraic Cunningham): когда один список короче и все элементы до размера более короткого списка, где он одинаков, более длинный список считается большим. Это также как и в обычных (бумажных) словарях.

ясно, что Python не просто движется через параллельные индексы

Да, это так, и он останавливается в первый раз, когда находит значения, которые не совпадают. Это действительно лексикографический порядок. Замените числа в ваших примерах буквами, а списки - строками:

"h" < "g" # False
"h" < "i" # True
"hf" < "i" # True
"hf" < "ig" # True
"hf" < "ie" # True - not huh, hf does come before ie alphabetically.
"abc" < "cba" # True
Другие вопросы по тегам