Ordenação de Coleções em Python: Diferenças entre sort() e sorted()

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 retornando None.
  • 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)]

Tags: Python sorting List iterables built-in-functions

Publicado em 7-16 03:25