Módulo 4 - Funções como objetos

Ordenar com key

11 min de leitura · por Cesar Gargiulo, revisado pela equipe ValorFinal e GuardiaSec · Atualizado em 01/07/2026

O que você vai aprender

  • Usar sorted para criar uma lista ordenada sem alterar a original.
  • Usar o método sort para ordenar a lista no lugar.
  • Passar uma função em key= para ordenar por um critério.
  • Inverter a ordem com reverse=True e combinar critérios.

sorted cria nova, sort muda no lugar

Ordenar é uma das tarefas mais comuns em programação, e o Python já resolve para você. Há dois caminhos. A função sorted recebe qualquer coleção e devolve uma lista nova, ordenada, deixando a original intacta. O método sort existe nas listas e ordena a própria lista no lugar, sem criar outra. Use sorted quando quiser preservar a lista original ou ordenar algo que não é lista; use sort quando puder alterar a lista e quiser economizar memória. Um detalhe que pega gente desavisada: sort devolve None, então nunca escreva nova = lista.sort().

numeros = [3, 1, 4, 1, 5, 9, 2]

# sorted: cria uma lista nova, preserva a original
ordenada = sorted(numeros)
print(ordenada)   # [1, 1, 2, 3, 4, 5, 9]
print(numeros)    # [3, 1, 4, 1, 5, 9, 2]  (intacta)

# sort: ordena no lugar e devolve None
numeros.sort()
print(numeros)    # [1, 1, 2, 3, 4, 5, 9]
print(numeros.sort())  # None  (cuidado: nao devolve a lista)

sorted preserva a original; sort altera no lugar e devolve None.

O poder está no key

Sem argumentos extras, sorted usa a ordem natural: números do menor para o maior, textos em ordem alfabética. O salto de qualidade vem com o parâmetro key. Ele recebe uma função, e essa função é chamada para cada item da coleção; o valor que ela devolve é o que entra na comparação. Ordenar palavras por tamanho é key=len. Ordenar ignorando maiúsculas é key=str.lower. E, quando o critério não tem uma função pronta, você escreve uma função lambda ali mesmo, curta e anônima, para extrair o valor de comparação.

palavras = ["banana", "kiwi", "abacaxi", "uva"]

# Ordem alfabetica (padrao)
print(sorted(palavras))            # ['abacaxi', 'banana', 'kiwi', 'uva']

# Por tamanho, usando a funcao pronta len
print(sorted(palavras, key=len))   # ['uva', 'kiwi', 'banana', 'abacaxi']

# Por tamanho, do maior para o menor
print(sorted(palavras, key=len, reverse=True))
# ['abacaxi', 'banana', 'kiwi', 'uva']

# Ignorando maiusculas e minusculas
nomes = ["ana", "Bruno", "carla", "Ana"]
print(sorted(nomes, key=str.lower))
# ['ana', 'Ana', 'Bruno', 'carla']

key=len ordena por tamanho; key=str.lower ignora a caixa; reverse inverte.

O caso mais frequente na vida real é ordenar uma lista de dicionários por um campo. Digamos que você tenha pessoas com nome e idade e queira ordenar por idade. A função de key precisa receber um dicionário e devolver o campo idade. Escrever uma função nomeada para isso funciona, mas para algo tão curto a lambda é mais direta: lambda p: p['idade']. Ela recebe cada pessoa e devolve a idade, que vira o critério. Para desempatar por um segundo campo, devolva uma tupla, e o Python compara elemento a elemento.

pessoas = [
    {"nome": "Ana", "idade": 30},
    {"nome": "Bruno", "idade": 25},
    {"nome": "Carla", "idade": 30},
]

# Por idade (crescente)
print(sorted(pessoas, key=lambda p: p["idade"]))
# [{Bruno,25}, {Ana,30}, {Carla,30}]

# Por idade e, no empate, por nome
print(sorted(pessoas, key=lambda p: (p["idade"], p["nome"])))
# [{Bruno,25}, {Ana,30}, {Carla,30}]

Uma lambda extrai o campo; uma tupla no key resolve o desempate.

Fixando: ordenar por critério

Guarde a receita: escolha sorted ou sort conforme queira preservar ou alterar a lista, passe key= com uma função que devolve o valor de comparação e use reverse=True se quiser do maior para o menor. Para campos de dicionário, a lambda é sua melhor amiga; para desempate, devolva uma tupla. Com isso você ordena praticamente qualquer coisa em uma linha, sem escrever algoritmo de ordenação. Esse é o jeito pythônico, e é a base da prática que fecha o módulo.

Teste rápido

Como ordenar uma lista de dicionários pessoas pela idade, de forma crescente?

Perguntas frequentes

Quando usar sorted e quando usar sort?
Use sorted quando quiser uma nova lista ordenada sem mexer na original, ou quando o dado não for uma lista (uma tupla ou as chaves de um dicionário). Use sort quando o objeto for uma lista, você puder alterá-la no lugar e quiser evitar criar outra na memória.
Por que key=len vai sem parênteses?
Porque você passa a função, não o resultado dela. O sorted chama len para cada item por conta própria. Se escrever key=len(), o Python tentaria executar len sem argumento e daria erro. A regra dos parênteses da aula 1 vale aqui: sem parênteses, você entrega a função.
O que é uma lambda e por que ela aparece tanto no key?
Lambda é uma função anônima de uma linha. Ela é prática no key porque muitas vezes você só precisa extrair um campo, como lambda p: p['idade']. Escrever uma função nomeada para isso funcionaria, mas seria mais verboso para algo tão curto.
Como ordenar por dois critérios, com desempate?
Faça a função de key devolver uma tupla com os campos na ordem de prioridade, como lambda p: (p['idade'], p['nome']). O Python compara o primeiro elemento e, em caso de empate, passa para o segundo. Funciona para quantos critérios você quiser.
Como ordenar do maior para o menor?
Adicione reverse=True, como sorted(numeros, reverse=True). Ele funciona junto com key, então sorted(palavras, key=len, reverse=True) ordena da palavra mais longa para a mais curta. É mais legível do que negar o valor no key.
A ordenação do Python é estável?
Sim. Itens considerados iguais pelo critério mantêm a ordem original entre si. Isso permite ordenar em etapas: ordene primeiro pelo critério menos importante e depois pelo mais importante, e os empates preservam a ordem anterior.

Fontes

Seu progresso fica salvo neste aparelho. Assinantes sincronizam entre os aparelhos.