Як працює порівняння кортежів у 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.