Статья Автор: Александр Ф. Алейников

9.8 Сравнение строк

Сравнение строк единичной длины

Начнем с примера сравнения строк, состоящих из одного символа. В Python это сравнение происходит путем сравнения кодов этих символов в таблице Unicode.

Приведенный ниже код:

print('a' > 'b')
print('a' < 'z')

выводит:

False
True

Действительно, код символа a в таблице Unicode равен числу 97, а символа b – числу 98. Число 97 меньше числа 98, поэтому и символ a меньше символа b. Аналогично символ z больше символа a, потому что код символа z (число 122) больше кода символа a (число 97).

Предыдущий код полностью эквивалентен следующему коду:

print(ord('a') > ord('b'))
print(ord('a') < ord('z'))

Обратите внимание, что буквы в нижнем регистре всегда больше своих аналогов в верхнем регистре. Для букв русского алфавита это правило также работает.

Приведённый ниже код:

print('d' > 'D')
print('Ы' < 'ы')

выводит:

True
True

Ничего удивительного в этом нет, потому что буквы в нижнем регистре идут после букв в верхнем регистре в таблице Unicode.

Подробнее ознакомиться с таблицей символов Unicode можно по ссылке. Обычно на практике достаточно оперировать таблицей ASCII, которая является подмножеством таблицы Unicode. Первые 128 символов таблицы Unicode совпадают с таблицей ASCII.

Сравнение строк не единичной длины

Обычно мы работаем не с отдельными символами, а со строками, которые состоят из нескольких символов сразу.

Алгоритм сравнения строк:

  1. Начинаем с первых символов каждой строки. Если символы равны, переходим к следующей паре символов
  2. Когда находим первый отличающийся символ, строка с меньшим символом считается "меньше"
  3. Если одна из строк заканчивается раньше, то более короткая считается "меньше"

Чтобы лучше разобраться с алгоритмом сравнения строк, рассмотрим несколько примеров.

Пример 1. Сравним строки 'hello' и 'hell'.

  • Сравнение первых символов: h и h – оба символа равны, переходим к следующей паре символов
  • Сравнение вторых символов: e и e – оба символа равны, переходим к следующей паре символов
  • Сравнение третьих символов: l и l – оба символа равны, переходим к следующей паре символов
  • Сравнение четвертых символов: l и l – оба символа равны, переходим к следующей паре символов
  • Сравнение пятых символов: o (у первой строки) и отсутствующий символ (у второй строки) – вторая строка закончилась

Поскольку у второй строки закончились символы, а у первой строки они еще есть, считается, что первая строка больше второй. Поэтому 'hello' > 'hell'.

Пример 2. Сравним строки 'men' и 'mya'.

1) Сравнение первых символов: m и m – оба символа равны, переходим к следующей паре символов

2) Сравнение вторых символов: e (у первой строки) и y (у второй строки) – символ e (число 101) меньше символа y (число 121)

Так как строки начинают различаться со второго символа, то на основе этого символа и делается вывод о результатах сравнения строк. В данном случае символ e меньше символа y. Получаем, что 'men' < 'mya'.

Обратите внимание, что в Python сравнение останавливается, как только находится первое различие между символами на соответствующих позициях. Дальнейшее сравнение символов не требуется.

Пример 3. Сравним строки 'Meeeeeooooooow' и 'meow'.

1) Сравнение первых символов: M (у первой строки) и m (у второй строки) –  символ M (число 77) меньше символа m (число 109).

Строки различаются уже на первых символах, и первый символ у первой строки меньше первого символа второй строки. Поэтому 'Meeeeeooooooow' < 'meow'.

Примечания

Примечание 1. Нельзя путать сравнение чисел и сравнение строк, содержащих эти числа.

Приведённый ниже код:

print(10 > 9)
print('10' > '9')

выводит:

True
False

Примечание 2. Мы можем сравнивать не только строки, состоящие из букв латинского алфавита, но и строки, состоящие из любых символов, которые входят в таблицу Unicode. Алгоритм сравнения строк при этом будет аналогичный – в соответствии с кодами символов в таблице Unicode.

Приведённый ниже код:

print('Тинькофф' == 'Т-банк')
print('¥' > '$€£')
print(max('🐷', '🦆', '🐔'))

выводит:

False
True
🦆

Примечание 3. В Python не поддерживается операция сравнения строк и чисел друг с другом.

Приведённый ниже код:

print('45' > 44)

приводит к возникновению ошибки:

TypeError: '>' not supported between instances of 'str' and 'int'

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

Примечание 4. В Python встроенные функции min() и max() могут принимать строки в качестве аргументов и сравнивают их лексикографически (используя порядок символов в кодировке Unicode). Как несложно догадаться, функция min() вернёт самую "маленькую" строку, а max() – самую "большую" строку.

Приведённый ниже код:

print(max('tree', 'try', 'true'))
print(min('cat', 'car', 'cape'))

выводит:

try
cape

Обратите внимание, что мы не можем одновременно передавать строки и числа в качестве аргументов в функции min() и max(). Это является следствием того, что мы не можем сравнивать строки с числами.

Приведённый ниже код:

print(min('2', 8, '45', 90))

приводит к возникновению ошибки:

TypeError: '<' not supported between instances of 'int' and 'str'
Пропустить Навигационные Ссылки.
Чтобы оставить комментарий нужна авторизация
Печать