Мне интересно, как Python выполняет сравнение строк, более конкретно, как он определяет результат при использовании оператора меньше, чем < или больше, чем >.
Например, если я вставляюprint('abc' < 'bac'), я получаю True. Я понимаю, что он сравнивает соответствующие символы в строке, однако неясно, почему из-за отсутствия лучшего термина "вес" больше того факта, что a меньше, чемb (первая позиция) в первой строке, а не того факта, что a меньше, чем b во второй строке (вторая позиция).
При сравнении используется лексикографический порядок: сначала сравниваются первые два элемента, и если они отличаются, это определяет результат сравнения; если они равны, сравниваются следующие два элемента и так далее, пока не будет исчерпана любая последовательность.
Также:
Лексикографический порядок строк использует кодовую точку Unicode для упорядочивания отдельных символов.
Результат False возвращается, как только a оказывается меньше b. Дальнейшие элементы не сравниваются (как вы можете видеть для вторых элементов: b > a is True).
В частности, это приводит к 'a' > 'A', 'b' > 'B' и т.д. включая 'a' > 'Z' all evaluate to True поскольку все строчные символы от a до z имеют более высокий номер кодовой точки, чем все символы верхнего регистра.
Ответ 2
Сравнение строк в Python носит лексикографический характер:
Строки сравниваются лексикографически, используя числовые эквиваленты (результат работы встроенной функции ord()) их символов. Unicode и 8-битные строки полностью совместимы при таком поведении.
Следовательно, в вашем примере, 'abc' < 'bac' 'a' численно предшествует (меньше) 'b' (в представлениях ASCII и Unicode), поэтому сравнение на этом заканчивается.
Ответ 3
Python и практически любой другой компьютерный язык используют те же принципы, которые (я надеюсь) вы использовали бы при поиске слова в печатном словаре:
(1) В зависимости от используемого человеческого языка у вас есть представление о порядке символов: 'a' < 'b' < 'c' и т. Д
(2) Первый символ имеет больший вес, чем второй символ: 'az' < 'za' (написан ли язык слева направо, или справа налево, или бустрофедоном, совершенно неважно)
(3) Если у вас закончились символы для тестирования, более короткая строка будет меньше более длинной: 'foo' < 'food'
Обычно в компьютерном языке "понятие порядка символов" довольно примитивно: каждый символ имеет номер, не зависящий от человеческого языка, ord(character) и символы сравниваются и сортируются с использованием этого номера. Часто такое упорядочивание не соответствует человеческому языку пользователя, и тогда вам нужно перейти к "сопоставлению", интересной теме.
Что? Как еще можно определить порядок, кроме как слева направо?
у С. Лотта есть известный контрпример при сортировке французского языка. Он включает в себя ударения: действительно, можно сказать, что во французском буквы сортируются слева направо, а ударения справа налево. Вот контрпример: у нас есть e < é и o < о , поэтому можно было бы ожидать, что слова cote, котэ, côte, котэ будут отсортированы как cote < котэ < котэ < котэ. Ну, это не то, что происходит, на самом деле у вас есть: cote < кот < котэ < котэ, то есть, если мы удалим "c" и "t", мы получим oe < ое < ое < ое < ое, что в точности соответствует порядку справа налево.
И последнее замечание: вы должны говорить не о сортировке слева направо и справа налево, а скорее о сортировке вперед и назад.
Действительно, существуют языки, написанные справа налево, и если вы думаете, что арабский и иврит отсортированы справа налево, вы можете быть правы с графической точки зрения, но вы ошибаетесь на логическом уровне!
Действительно, Unicode рассматривает символьные строки, закодированные в логическом порядке, а направление записи - это явление, происходящее на уровне символов. Другими словами, даже если в слове שלום буква shin стоит справа от слова lamed, логически она стоит перед ним. Чтобы отсортировать это слово, сначала рассмотрим shin, затем lamed, затем vav, затем mem, и это в прямом порядке (хотя иврит пишется справа налево), в то время как французские ударения сортируются в обратном порядке (хотя французский пишется слева направо).