Ordenação em Python: sort(), sorted(), key e ordem personalizada
Este tutorial foi traduzido do original em inglês.Read in EnglishLeer en españolЧитать на русскомอ่านภาษาไทยAvisar sobre um erro de tradução
Imagine a estante de livros da sua casa. Os livros estão espalhados por todo lado: alguns por título, outros por cor, alguns enfiados de lado. Achar qualquer coisa leva uma eternidade.
Agora imagine organizar essa estante em ordem alfabética. De repente, achar qualquer livro leva segundos. Esse é o poder da ordenação: ela transforma o caos em ordem.
O Python oferece duas ferramentas principais para ordenar: o método sort() e a função sorted(). Elas parecem iguais, mas funcionam de forma diferente. Neste tutorial, você vai aprender quando usar cada uma, como ordenar em ordem inversa e como ordenar com regras próprias usando funções key.
Qual é a diferença entre sort() e sorted()?
Esta é a distinção mais importante da ordenação em Python. O método sort() altera diretamente a lista original. A função sorted() cria uma lista nova, já ordenada, e deixa a original intacta.
Pense assim: sort() é como reorganizar os livros na sua estante. sorted() é como montar um catálogo ordenado e deixar a estante exatamente como estava.
[1, 2, 5, 8, 9]
[1, 2, 5, 8, 9] [5, 2, 8, 1, 9]
names = ['Charlie', 'Alice', 'Bob']
result = names.sort()
print(result) # None!names = ['Charlie', 'Alice', 'Bob']
result = sorted(names)
print(result) # ['Alice', 'Bob', 'Charlie']Há outra grande diferença: sorted() funciona com qualquer iterável (strings, tuplas, dicionários e até geradores). O método sort() só funciona com listas.
['h', 'n', 'o', 'p', 't', 'y'] [1, 1, 3, 4, 5]
Como ordenar em ordem inversa
Tanto sort() quanto sorted() aceitam um parâmetro reverse. Defina-o como True para ordenar do maior para o menor, em vez do menor para o maior.
[61, 72, 88, 95, 100] [100, 95, 88, 72, 61]
Por padrão, strings são ordenadas em ordem alfabética. Com reverse=True, elas ficam em ordem alfabética inversa.
['apple', 'banana', 'cherry', 'date'] ['date', 'cherry', 'banana', 'apple']
O que são funções key na ordenação em Python?
Às vezes você não quer ordenar pelos próprios valores. Você quer ordenar por alguma propriedade de cada valor. Por exemplo, ordenar palavras pelo tamanho, e não em ordem alfabética.
O parâmetro key permite passar uma função que transforma cada item antes da comparação. O Python aplica essa função a todos os itens e depois ordena com base nos resultados. Os itens originais continuam intactos: só a ordem muda.
['pie', 'kiwi', 'banana', 'strawberry']
Aqui, len é a função key. O Python chama len() em cada palavra e usa esses tamanhos para decidir a ordem. "pie" tem 3 letras, "kiwi" tem 4, e assim por diante.
Você pode usar qualquer função como key. Um exemplo comum é ordenar sem diferenciar maiúsculas de minúsculas, usando str.lower.
['Bob', 'CHARLIE', 'alice', 'dave'] ['alice', 'Bob', 'CHARLIE', 'dave']
Como ordenar com funções lambda
Funções embutidas como len e str.lower só levam você até certo ponto. Quando precisa de uma lógica de ordenação própria, você usa uma lambda: uma função pequena e anônima, escrita em uma linha.
Uma lambda recebe um item e retorna o valor que será usado na ordenação. A sintaxe é lambda item: expression.
[12, 23, 34, 45, 67, 89]
A lambda lambda x: x % 10 recebe cada número e retorna o último dígito dele (o resto da divisão por 10). O Python então ordena por esses últimos dígitos: 2, 3, 4, 5, 7, 9.
['zebra', 'apple', 'hello', 'mango']
['ant', 'bat', 'cat', 'dog', 'elephant']
Como ordenar dicionários e dados mais complexos
Em programas reais, raramente você ordena listas simples de números. É mais comum ordenar listas de dicionários, como alunos por nota ou produtos por preço.
Bob: 85 Diana: 88 Alice: 92 Charlie: 97
Charlie: 97 Alice: 92 Diana: 88 Bob: 85
Você também pode ordenar as chaves ou os valores do próprio dicionário. Por padrão, a função sorted() percorre as chaves de um dicionário.
apple: $0.75 banana: $0.25 cherry: $3.25 date: $1.75 banana: $0.25 apple: $0.75 date: $1.75 cherry: $3.25
O que é ordenação estável e por que ela importa?
O Python usa um algoritmo de ordenação chamado Timsort, que é estável. Isso quer dizer que, quando dois itens são iguais segundo a chave de ordenação, eles mantêm a ordem original.
Isso importa muito na prática. Se você ordena alunos por nota e dois alunos têm a mesma nota, eles ficam na mesma ordem em que estavam antes da ordenação.
Bob: 85 Diana: 85 Alice: 90 Charlie: 90
Exercícios práticos
Você tem uma lista de notas de provas. Exiba as notas ordenadas da menor para a maior e, na linha seguinte, da maior para a menor.
Use sorted() para que a lista original continue igual.
Leia o código abaixo com atenção. O que ele vai exibir? Lembre-se da diferença principal entre sort() e sorted().
Digite a saída exata.
Ordene a lista de palavras pelo tamanho (as mais curtas primeiro). Se duas palavras tiverem o mesmo tamanho, elas devem continuar na ordem original.
Exiba a lista ordenada.
O código abaixo tenta ordenar nomes em ordem alfabética, mas os nomes com maiúscula e com minúscula estão se misturando de forma errada. Corrija a ordenação para que ela siga a ordem alfabética de verdade, sem importar se as letras são maiúsculas ou minúsculas.
A saída deve ser: ['alice', 'Bob', 'Charlie', 'dave', 'Eve']
Ordene a lista de alunos pela nota, da maior para a menor. Exiba o nome e a nota de cada aluno em uma linha separada, no formato: Name: Grade
Ordene a lista de produtos primeiro pela categoria (em ordem alfabética) e depois, dentro de cada categoria, pelo preço (o menor primeiro).
Exiba cada produto em uma linha separada, no formato: category: name - $price