Як працює порівняння кортежів у Python?


178

Я читав книгу програмування Core Python , і автор показує такий приклад, як:

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

Отже, мені цікаво, як / чому це дорівнює хибності? Як питон порівнює ці два кортежі?

До речі, це не пояснено в книзі.

Відповіді:


190

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

Див. Загальні послідовні операції :

Послідовності одного типу також підтримують порівняння. Зокрема, кортежі та списки лексикографічно порівнюються шляхом порівняння відповідних елементів. Це означає, що для порівняння рівних кожен елемент повинен порівнювати рівне, а дві послідовності повинні бути одного типу і мати однакову довжину.

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

Лексикографічне порівняння між вбудованими колекціями працює таким чином:

  • Щоб дві колекції порівнювали рівні, вони повинні бути одного типу, мати однакову довжину, і кожна пара відповідних елементів повинна порівнювати однакові (наприклад, [1,2] == (1,2)помилково, оскільки тип не однаковий).
  • Колекції, що підтримують порівняння замовлень, упорядковуються так само, як і перші їх нерівні елементи (наприклад, [1,2,x] <= [1,2,y]мають те саме значення, що і x <= y). Якщо відповідного елемента не існує, спочатку впорядковується коротша колекція (наприклад, [1,2] < [1,2,3]правда).

Якщо вони не рівні, послідовності впорядковані так само, як і перші їх різні елементи. Наприклад, 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-compitation : не думайте, що кортеж "більший", ніж інший, лише якщо будь-який елемент першого перевищує відповідний одне в друге.


4
Це може ввести в оману, коли говорити про <та >. Наприклад, (0, 1) < (1, 0)оцінює до True.
Жоден

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

8
@ J.Money, чому ти вважаєш, що це може ввести в оману?
Дон

1
@CharlieParker <і >не маю на увазі "менший за" і "більший за", але "приходить раніше" і "приходить після": так (0, 1)"приходить раніше"(1, 0)
Дон

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

20

Документація Python це пояснює.

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


Сторінка, пов'язана з цією відповіддю, схоже, не містить цитованого тексту.
підключення

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.