Как работает сравнение кортежей в Python?


179

Я читал книгу по программированию на Core Python , и автор показывает такой пример:

(4, 5) < (3, 5) # Equals false

Итак, мне интересно, как / почему это равно ложному? Как Python сравнивает эти два кортежа?

Кстати, это не объясняется в книге.

Ответы:


190

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

Смотрите общие операции последовательности :

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

Также сравнение ценностей для получения дополнительной информации:

Лексикографическое сравнение встроенных коллекций работает следующим образом:

  • Чтобы две коллекции сравнивались на равных, они должны быть одного типа, иметь одинаковую длину, а каждая пара соответствующих элементов должна сравнивать равные (например, [1,2] == (1,2)false, поскольку тип не совпадает).
  • Коллекции, поддерживающие сравнение порядка, упорядочиваются так же, как и их первые неравные элементы (например, [1,2,x] <= [1,2,y]имеет то же значение, что и x <= y). Если соответствующий элемент не существует, более короткий набор упорядочивается первым (например, [1,2] < [1,2,3]true).

Если не равны, последовательности упорядочены так же, как их первые отличающиеся элементы. Например, cmp ([1,2, x], [1,2, y]) возвращает то же самое, что cmp (x, y). Если соответствующий элемент не существует, более короткая последовательность считается меньшей (например, [1,2] <[1,2,3] возвращает True).

Примечание 1 : <и >не означает «меньше чем» и «больше, чем», но «до» и «после»: поэтому (0, 1) «до» (1, 0).

Примечание 2 : кортежи не должны рассматриваться как векторы в n-мерном пространстве по сравнению с их длиной.

Примечание 3 : ссылаясь на вопрос /programming/36911617/python-2-tuple-comparison : не думайте, что кортеж «больше» другого, только если какой-либо элемент первого больше соответствующего один во втором.


4
Это может вводить в заблуждение, когда речь идет об <и >. Например, (0, 1) < (1, 0)оценивает до True.
Нет

4
@CMCDragonkai - да. попробуйте: x = tuple([0 for _ in range(n)])и сделайте то же самое для вас. Установка n = 100, 1000, 10000 и 100000 и запуск %timeit x==yдали значения синхронизации, равные 0,5, 4,6, 43,9 и 443 микросекунды соответственно, что примерно настолько близко к O (n), насколько вы можете практически получить.
Майкл Скотт Катберт

8
@ J.Money, почему ты думаешь, что это может ввести в заблуждение?
Дон

1
@CharlieParker <и >не означает «меньше, чем» и «больше, чем», но «предшествует» и «приходит после»: так (0, 1)«предшествует»(1, 0)
Дон

3
@ Не думаю, что нам непонятно, какой тип порядка наложить на кортеж. Я полагаю, что питон просто обрабатывает его как числа, сначала проверяя наибольшую значащую цифру, и переходя к разрыву, умирает ... (поэлементно)
Чарли Паркер,

20

Документация Python объясняет это.

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


Страница, на которую теперь ссылается этот ответ, по-видимому, не содержит цитируемого текста.
plugwash

0

Документация Python 2.5 объясняет это хорошо.

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

Если не равны, последовательности упорядочены так же, как их первые отличающиеся элементы. Например, cmp ([1,2, x], [1,2, y]) возвращает то же самое, что cmp (x, y). Если соответствующий элемент не существует, более короткая последовательность упорядочивается первой (например, [1,2] <[1,2,3]).

К сожалению, эта страница, кажется, исчезла в документации для более свежих версий.


0
У меня была некоторая путаница перед сравнением целых чисел, поэтому я объясню это, чтобы быть более дружелюбным для начинающих на примере

a = ('A','B','C') # see it as the string "ABC" b = ('A','B','D')

A преобразуется в соответствующий ему ASCII то ord('A') #65же самое для других элементов

Таким образом, >> a>b # True вы можете думать об этом как о сравнении строки (это точно, на самом деле)

То же самое относится и к целым числам.

x = (1,2,2) # see it the string "123" y = (1,2,3) x > y # False

потому что (1 не больше 1, перейти к следующему, 2 не больше 2, перейти к следующим 2 меньше, чем три -лексографически -)

Ключевой момент упоминается в ответе выше

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


2
(1,2,3) > (1,2,2)даетTrue
Вишал Сингх
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.