O ecossistema Python oferece duas abordagens principais para ordenar coleções de dados: o método sort(), exclusivo para listas, e a função embutida sorted(). Embora ambas utilizem o algoritmo Timsort sob o capô e compartilhem parâmetros similares, suas aplicações e comportamentos diferem significativamente.
- sort(): É um método pertencente ao objeto
list. Ele realiza a ordenação no próprio local (in-place), modificando a estrutura original e retornandoNone. - sorted(): É uma função global (built-in) que aceita qualquer objeto iterável. Ela preserva a estrutura original e retorna uma nova lista contendo os elementos ordenados.
É importante notar que, a partir do Python 3, o antigo parâmetro cmp foi completamente descontinuado em favor do uso de funções-chave (key).
O Método de Lista: sort()
Como mencinoado, o sort() atua diretamente na instância da lista que o invoca. Seus parâmetros principais são key (uma função que extrai o critério de comparação de cada elemento) e reverse (um booleano que, quando True, inverte a ordem para descendente).
# Ordenação numérica básica
temperaturas = [14, -3, 8, 0, -12, 5, 5]
# Ordem ascendente (padrão)
temperaturas.sort()
print(temperaturas) # Saída: [-12, -3, 0, 5, 5, 8, 14]
# Ordem descendente
temperaturas.sort(reverse=True)
print(temperaturas) # Saída: [14, 8, 5, 5, 0, -3, -12]
O parâmetro key é extremametne poderoso. Ele aceita qualquer função que receba um único argumento. Podemos utilizar funções nomeadas ou expressões lambda para definir lógicas complexas de ordenação para diferentes tipos de dados.
valores = [14, -3, 8, 0, -12, 5, 5]
# 1. Ordenando por valor absoluto usando função nomeada
def modulo(x):
return abs(x)
valores.sort(key=modulo)
print(valores) # Saída: [0, -3, 5, 5, 8, 14, -12]
# 2. Ordenando strings pelo comprimento (do maior para o menor)
palavras = ["python", "dev", "engenharia", "code"]
palavras.sort(key=lambda palavra: len(palavra), reverse=True)
print(palavras) # Saída: ['engenharia', 'python', 'code', 'dev']
# 3. Ordenando tuplas com base no segundo índice
coordenadas = [("X", 45), ("Y", 12), ("Z", 89)]
coordenadas.sort(key=lambda item: item[1])
print(coordenadas) # Saída: [('Y', 12), ('X', 45), ('Z', 89)]
# 4. Ordenando uma lista de dicionários por uma chave específica
usuarios = [
{"nome": "Ana", "idade": 30},
{"nome": "Bruno", "idade": 22},
{"nome": "Carla", "idade": 27}
]
usuarios.sort(key=lambda u: u["idade"])
print(usuarios)
# Saída: [{'nome': 'Bruno', 'idade': 22}, {'nome': 'Carla', 'idade': 27}, {'nome': 'Ana', 'idade': 30}]
A Função Embutida: sorted()
Diferente do método anterior, sorted() não exige que a coleção seja uma lista. Ela aceita qualquer iterável (como strings, tuplas, sets e dicionários) e sempre devolve uma nova instância do tipo list.
Os parâmetros iterable, key e reverse funcionam exatamente da mesma maneira que no sort().
dados_originais = [42, 17, -5, 99, 0, 17]
# A coleção original permanece inalterada
dados_asc = sorted(dados_originais)
print(dados_originais) # Saída: [42, 17, -5, 99, 0, 17]
print(dados_asc) # Saída: [-5, 0, 17, 17, 42, 99]
# Aplicando a ordenação descendente
dados_desc = sorted(dados_originais, reverse=True)
print(dados_desc) # Saída: [99, 42, 17, 17, 0, -5]
A versatilidade de sorted() brilha ao lidarmos com estruturas de dados que não posssuem métodos próprios de ordenação.
# Ordenando os caracteres de uma string alfabeticamente
texto = "algoritmo"
letras_ordenadas = sorted(texto)
print(letras_ordenadas) # Saída: ['a', 'g', 'i', 'l', 'm', 'o', 'o', 'r', 't']
# Ordenando elementos de um set
conjunto_numeros = {42, 17, -5, 99, 0}
lista_de_set = sorted(conjunto_numeros)
print(lista_de_set) # Saída: [-5, 0, 17, 42, 99]
# Ordenando itens de um dicionário com base em seus valores
inventario = {"espada": 15, "pocao": 5, "escudo": 10}
inventario_ordenado = sorted(inventario.items(), key=lambda item: item[1])
print(inventario_ordenado) # Saída: [('pocao', 5), ('escudo', 10), ('espada', 15)]