Вопрос-Ответ

How are strings compared?

Как сравниваются строки?

Мне интересно, как Python выполняет сравнение строк, более конкретно, как он определяет результат при использовании оператора меньше, чем < или больше, чем >.

Например, если я вставляюprint('abc' < 'bac'), я получаю True. Я понимаю, что он сравнивает соответствующие символы в строке, однако неясно, почему из-за отсутствия лучшего термина "вес" больше того факта, что a меньше, чемb (первая позиция) в первой строке, а не того факта, что a меньше, чем b во второй строке (вторая позиция).


Многие люди задают этот вопрос, когда строки содержат представления чисел, и хотят сравнить числа по числовому значению. Простое решение - сначала преобразовать значения. Смотрите, как мне преобразовать строку в float или int? . Если в списке или другой коллекции несколько чисел, см. Как я могу собрать результаты повторного вычисления в списке, словаре и т.д. (или создайте копию списка с измененным каждым элементом)? для пакетного преобразования.

Если вы пытаетесь сравнить строки, которые содержат последовательности цифр, обрабатывая цифры так, как если бы они были числовыми (иногда это называется "естественной сортировкой"), см. Существует ли встроенная функция для естественной сортировки строк? .

Переведено автоматически
Ответ 1

Из документов:


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


Также:


Лексикографический порядок строк использует кодовую точку Unicode для упорядочивания отдельных символов.


или на Python 2:


Лексикографический порядок строк использует порядок ASCII для отдельных символов.


В качестве примера:

>>> 'abc' > 'bac'
False
>>> ord('a'), ord('b')
(97, 98)

Результат False возвращается, как только a оказывается меньше b. Дальнейшие элементы не сравниваются (как вы можете видеть для вторых элементов: b > a is True).

Помните о нижнем и верхнем регистре:

>>> [(x, ord(x)) for x in abc]
[('a', 97), ('b', 98), ('c', 99), ('d', 100), ('e', 101), ('f', 102), ('g', 103), ('h', 104), ('i', 105), ('j', 106), ('k', 107), ('l', 108), ('m', 109), ('n', 110), ('o', 111), ('p', 112), ('q', 113), ('r', 114), ('s', 115), ('t', 116), ('u', 117), ('v', 118), ('w', 119), ('x', 120), ('y', 121), ('z', 122)]
>>> [(x, ord(x)) for x in abc.upper()]
[('A', 65), ('B', 66), ('C', 67), ('D', 68), ('E', 69), ('F', 70), ('G', 71), ('H', 72), ('I', 73), ('J', 74), ('K', 75), ('L', 76), ('M', 77), ('N', 78), ('O', 79), ('P', 80), ('Q', 81), ('R', 82), ('S', 83), ('T', 84), ('U', 85), ('V', 86), ('W', 87), ('X', 88), ('Y', 89), ('Z', 90)]

В частности, это приводит к 'a' > 'A', 'b' > 'B' и т.д. включая 'a' > 'Z' all evaluate to True поскольку все строчные символы от a до z имеют более высокий номер кодовой точки, чем все символы верхнего регистра.

Ответ 2

Сравнение строк в Python носит лексикографический характер:

Из документации по Python: http://docs.python.org/reference/expressions.html


Строки сравниваются лексикографически, используя числовые эквиваленты (результат работы встроенной функции ord()) их символов. Unicode и 8-битные строки полностью совместимы при таком поведении.


Следовательно, в вашем примере, 'abc' < 'bac' 'a' численно предшествует (меньше) 'b' (в представлениях ASCII и Unicode), поэтому сравнение на этом заканчивается.

Ответ 3

Python и практически любой другой компьютерный язык используют те же принципы, которые (я надеюсь) вы использовали бы при поиске слова в печатном словаре:

(1) В зависимости от используемого человеческого языка у вас есть представление о порядке символов: 'a' < 'b' < 'c' и т. Д

(2) Первый символ имеет больший вес, чем второй символ: 'az' < 'za' (написан ли язык слева направо, или справа налево, или бустрофедоном, совершенно неважно)

(3) Если у вас закончились символы для тестирования, более короткая строка будет меньше более длинной: 'foo' < 'food'

Обычно в компьютерном языке "понятие порядка символов" довольно примитивно: каждый символ имеет номер, не зависящий от человеческого языка, ord(character) и символы сравниваются и сортируются с использованием этого номера. Часто такое упорядочивание не соответствует человеческому языку пользователя, и тогда вам нужно перейти к "сопоставлению", интересной теме.

Ответ 4

Взгляните также на Как мне сортировать строки Unicode по алфавиту в Python? где обсуждаются правила сортировки, задаваемые алгоритмом сортировки Unicode (http://www.unicode.org/reports/tr10 /).

Чтобы ответить на комментарий


Что? Как еще можно определить порядок, кроме как слева направо?


у С. Лотта есть известный контрпример при сортировке французского языка. Он включает в себя ударения: действительно, можно сказать, что во французском буквы сортируются слева направо, а ударения справа налево. Вот контрпример: у нас есть e < é и o < о , поэтому можно было бы ожидать, что слова cote, котэ, côte, котэ будут отсортированы как cote < котэ < котэ < котэ. Ну, это не то, что происходит, на самом деле у вас есть: cote < кот < котэ < котэ, то есть, если мы удалим "c" и "t", мы получим oe < ое < ое < ое < ое, что в точности соответствует порядку справа налево.

И последнее замечание: вы должны говорить не о сортировке слева направо и справа налево, а скорее о сортировке вперед и назад.

Действительно, существуют языки, написанные справа налево, и если вы думаете, что арабский и иврит отсортированы справа налево, вы можете быть правы с графической точки зрения, но вы ошибаетесь на логическом уровне!

Действительно, Unicode рассматривает символьные строки, закодированные в логическом порядке, а направление записи - это явление, происходящее на уровне символов. Другими словами, даже если в слове שלום буква shin стоит справа от слова lamed, логически она стоит перед ним. Чтобы отсортировать это слово, сначала рассмотрим shin, затем lamed, затем vav, затем mem, и это в прямом порядке (хотя иврит пишется справа налево), в то время как французские ударения сортируются в обратном порядке (хотя французский пишется слева направо).

2023-08-19 00:33 python string