Сравнение строк единичной длины
Начнем с примера сравнения строк, состоящих из одного символа. В 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. Сравним строки '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'