Como a comparação de tupla funciona em Python?

178

Eu tenho lido o livro de programação Core Python , e o autor mostra um exemplo como:

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

Então, eu estou pensando, como / por que isso é falso? Como o python compara essas duas tuplas?

Aliás, não está explicado no livro.

Paulo
fonte

Respostas:

191

As tuplas são comparadas posição por posição: o primeiro item da primeira tupla é comparado ao primeiro item da segunda tupla; se eles não são iguais (ou seja, o primeiro é maior ou menor que o segundo), esse é o resultado da comparação; caso contrário, o segundo item é considerado, o terceiro e assim por diante.

Consulte Operações comuns de sequência :

Sequências do mesmo tipo também suportam comparações. Em particular, tuplas e listas são comparadas lexicograficamente através da comparação dos elementos correspondentes. Isso significa que, para comparar igual, todo elemento deve comparar igual e as duas seqüências devem ser do mesmo tipo e ter o mesmo comprimento.

Também faça comparações de valores para obter mais detalhes:

A comparação lexicográfica entre coleções internas funciona da seguinte maneira:

  • Para que duas coleções comparem iguais, elas devem ser do mesmo tipo, ter o mesmo comprimento e cada par de elementos correspondentes deve comparar igual (por exemplo, [1,2] == (1,2)é falso porque o tipo não é o mesmo).
  • As coleções que suportam a comparação de pedidos são ordenadas da mesma forma que seus primeiros elementos desiguais (por exemplo, [1,2,x] <= [1,2,y]tem o mesmo valor que x <= y). Se um elemento correspondente não existir, a coleção mais curta será solicitada primeiro (por exemplo, [1,2] < [1,2,3]é verdadeira).

Se não for igual, as seqüências são ordenadas da mesma forma que seus primeiros elementos diferentes. Por exemplo, cmp ([1,2, x], [1,2, y]) retorna o mesmo que cmp (x, y). Se o elemento correspondente não existir, a sequência mais curta será considerada menor (por exemplo, [1,2] <[1,2,3] retorna True).

Nota 1 : <e >não significa "menor que" e "maior que" mas "é anterior" e "é posterior": então (0, 1) "é anterior" (1, 0).

Nota 2 : as tuplas não devem ser consideradas vetores em um espaço n-dimensional , comparadas de acordo com seu comprimento.

Nota 3 : referindo-se à pergunta /programming/36911617/python-2-tuple-comparison : não pense que uma tupla seja "maior" que outra somente se algum elemento do primeiro for maior que o correspondente um no segundo.

Don
fonte
4
Isso pode ser enganoso ao falar sobre <e >. Por exemplo, (0, 1) < (1, 0)avalia como True.
Nenhum
4
@CMCDragonkai - sim. tente: x = tuple([0 for _ in range(n)])e faça o mesmo para y. A definição de n = 100, 1000, 10.000 e 100.000 e a execução %timeit x==yderam valores de temporização de 0,5, 4,6, 43,9 e 443 microssegundos, respectivamente, o que é quase o mais próximo de O (n) que você pode obter praticamente.
Michael Scott Cuthbert
8
@ J.Money Por que você acha que pode ser enganador?
Don
1
@CharlieParker <e >não significa "menor que" e "maior que", mas "vem antes" e "vem depois": então (0, 1)"vem antes"(1, 0)
Don
3
@ Don Acho que não está claro para nós que tipo de ordem impor a uma tupla. Eu acho que python apenas trata como números, marcando o maior dígito significativo primeira e a passar para dies quebra ... (de uma forma sábia elemento)
Charlie Parker
20

A documentação do Python explica isso.

Tuplas e listas são comparadas lexicograficamente usando a comparação dos elementos correspondentes. Isso significa que, para comparar igual, cada elemento deve comparar igual e as duas seqüências devem ser do mesmo tipo e ter o mesmo comprimento.

Keith
fonte
A página agora vinculada a esta resposta parece não conter o texto citado.
plugwash 10/03
0

A documentação do python 2.5 explica bem.

Tuplas e listas são comparadas lexicograficamente usando a comparação dos elementos correspondentes. Isso significa que, para comparar igual, cada elemento deve comparar igual e as duas seqüências devem ser do mesmo tipo e ter o mesmo comprimento.

Se não for igual, as seqüências são ordenadas da mesma forma que seus primeiros elementos diferentes. Por exemplo, cmp ([1,2, x], [1,2, y]) retorna o mesmo que cmp (x, y). Se o elemento correspondente não existir, a sequência mais curta será ordenada primeiro (por exemplo, [1,2] <[1,2,3]).

Infelizmente, essa página parece ter desaparecido na documentação para versões mais recentes.

plugwash
fonte
0
Eu já tinha alguma confusão antes em relação à comparsão de números inteiros, por isso vou explicar que é mais amigável para iniciantes com um exemplo

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

A é convertido em seu ASCII correspondente ord('A') #65mesmo para outros elementos

Então, >> a>b # True você pode pensar nisso como uma comparação entre as strings (é exatamente, na verdade)

o mesmo vale para números inteiros também.

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

porque (1 não é maior que 1, move para o próximo, 2 não é maior que 2, move para o próximo 2 é menor que três --lexicograficamente -)

O ponto principal é mencionado na resposta acima

pense nele como um elemento antes de outro elemento alfabético que não seja maior que um elemento e, nesse caso, considere todos os elementos da tupla como uma sequência.

Bishoy Abd
fonte
2
(1,2,3) > (1,2,2)True
Vishal Singh