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.
Ouvir o resumo desta aula
Um recap de cerca de 2 minutos na voz do Valim, para ouvir no trânsito ou na academia.
Ler a transcrição do resumo
Resumo da aula: Ordenar com key.
Os objetivos desta aula. 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.
Veja o essencial, parte por parte.
sorted cria nova, sort muda no lugar. sorted(lista) devolve uma nova lista ordenada e não altera a original.
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.
Fixando: ordenar por critério. Nunca faça nova = lista.sort(): sort devolve None, você perderia a lista.
Esse foi o resumo do essencial. Para se aprofundar, leia a aula completa e responda os exercícios.
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.