Операторы неравенства Питона; сравнение списков
Возникают проблемы с пониманием поведения 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