
Ordenar um dicionário pelos seus valores é uma tarefa comum na programação Python, especialmente quando se lida com dados lidos de bancos de dados ou outras fontes estruturadas. Ao trabalhar com dicionários Python, você frequentemente precisa reorganizar os pares chave-valor com base nos valores armazenados, não nas chaves.
Neste guia completo, vamos explorar todas as formas de ordenar um dicionário Python por valor, tanto em ordem crescente quanto decrescente. Você aprenderá a reorganizar os itens do dicionário usando diferentes técnicas, desde as mais modernas até soluções para versões antigas do Python.
Este tutorial ensina como reordenar os elementos internos de um único dicionário. Se você está trabalhando com uma lista contendo vários dicionários e precisa ordenar essa lista, temos um guia específico sobre como ordenar uma lista de dicionários em Python.
Por que ordenar um dicionário por valor?
Antes de mergulharmos nas técnicas, é importante entender quando ordenar dicionário Python por valor é necessário. Alguns cenários comuns incluem:
- Classificar resultados de contagem (ex: palavras mais frequentes em um texto);
- Organizar pontuações de jogadores em ordem de ranking;
- Ordenar produtos por preço ou popularidade;
- Exibir dados estatísticos em ordem de relevância;
Em todos esses casos, você tem um dicionário onde as chaves representam identificadores (nomes, IDs, produtos) e os valores são números ou strings que você deseja usar como critério de ordenação.
Ordenando os pares chave-valor de um dicionário
A partir do Python 3.7, os dicionários mantêm a ordem de inserção por padrão. Isso é fundamental ao ordenar um dicionário Python por valor, pois o novo dicionário preserva a ordem estabelecida pela ordenação.
Método 1: Usando Dictionary Comprehension
A forma mais elegante e pythônica de ordenar dicionário por valor é utilizando dictionary comprehension combinada com a função sorted():
x = {1: 2, 3: 4, 4: 3, 2: 1, 0: 0}
dicionario_ordenado = {k: v for k, v in sorted(x.items(), key=lambda item: item[1])}
print(dicionario_ordenado)
TestarA saída será um novo dicionário com os pares chave-valor ordenados em ordem crescente pelos valores:
{0: 0, 2: 1, 1: 2, 4: 3, 3: 4}
Como funciona:
- x.items() retorna todos os pares chave-valor do dicionário como tuplas
- sorted() ordena essas tuplas usando o key=lambda item: item[1], que significa “ordene pelo segundo elemento da tupla” (o valor)
- A dictionary comprehension {k: v for k, v} reconstrói o dicionário ordenado
Método 2: usando a função dict()
Alternativamente, você pode ordenar um dicionário Python por valor usando a função dict() para converter os itens ordenados:
x = {1: 2, 3: 4, 4: 3, 2: 1, 0: 0}
dicionario_ordenado = dict(sorted(x.items(), key=lambda item: item[1]))
print(dicionario_ordenado)
TestarEste método produz o mesmo resultado e é igualmente eficiente. A escolha entre dictionary comprehension e dict() é uma questão de preferência pessoal ao ordenar dicionário por valor.
Exemplo prático: ordenando pontuações de jogadores
pontuacoes = {'Alice': 85, 'Bob': 92, 'Carlos': 78, 'Diana': 95}
ranking = {k: v for k, v in sorted(pontuacoes.items(), key=lambda item: item[1], reverse=True)}
print(ranking)
# Saída: {'Diana': 95, 'Bob': 92, 'Alice': 85, 'Carlos': 78}
TestarNote o parâmetro reverse=True para ordenar o dicionário Python em ordem decrescente, colocando as maiores pontuações primeiro.
Ordenação em versões anteriores do Python
Em versões anteriores ao Python 3.7, os dicionários não garantem a preservação da ordem. No entanto, você ainda pode ordenar dicionário Python por valor obtendo uma representação ordenada.
Usando operator.itemgetter()
O módulo operator fornece uma alternativa mais performática à função lambda ao ordenar um dicionário por valor:
import operator
x = {1: 2, 3: 4, 4: 3, 2: 1, 0: 0}
sorted_x = sorted(x.items(), key=operator.itemgetter(1))
print(sorted_x)
TestarVantagens do operator.itemgetter():
- Mais rápido que funções lambda para grandes conjuntos de dados
- Código mais limpo e explícito
- Ideal para ordenar dicionários Python com muitos itens
sorted_x
será uma lista de tuplas ordenadas pelo segundo elemento (o valor) em cada tupla. Para convertê-la de volta em dicionário:
dicionario_ordenado = dict(sorted_x)
Ordenação por valores usando collections.OrderedDict
Se você está trabalhando com Python 3.6 ou versões anteriores e precisa garantir que os pares chave-valor permaneçam ordenados, use collections.OrderedDict
:
import collections
import operator
x = {1: 2, 3: 4, 4: 3, 2: 1, 0: 0}
sorted_x = sorted(x.items(), key=operator.itemgetter(1))
dicionario_ordenado = collections.OrderedDict(sorted_x)
print(dicionario_ordenado)
TestarO OrderedDict garante que os itens do dicionário mantenham a ordem de inserção, mesmo em versões antigas do Python.
Ordenação simples por valores
Para uma abordagem direta quando você precisa apenas das chaves ordenadas (sem reconstruir o dicionário completo), use:
dict1 = {'maçã': 3, 'banana': 1, 'laranja': 2}
chaves_ordenadas = sorted(dict1, key=dict1.get)
print(chaves_ordenadas)
# Saída: ['banana', 'laranja', 'maçã']
TestarComo funciona:
- dict1.get é um método que retorna o valor associado a cada chave
- sorted(dict1, key=dict1.get) ordena as chaves com base em seus valores correspondentes
Esta técnica é útil quando você precisa apenas da sequência ordenada de chaves para iterar sobre o dicionário na ordem correta.
Usando lambda para ordenar um dicionário por valor
Funções lambda oferecem máxima flexibilidade ao ordenar um dicionário Python por valor. Vamos explorar diferentes cenários:
Ordenação crescente
d = {'one': 1, 'three': 3, 'five': 5, 'two': 2, 'four': 4}
itens_ordenados = sorted(d.items(), key=lambda x: x[1])
print(itens_ordenados)
# Saída: [('one', 1), ('two', 2), ('three', 3), ('four', 4), ('five', 5)]
TestarO método d.items() retorna os pares chave-valor do dicionário, e a função lambda x: x[1] indica que a ordenação deve ser feita com base no valor (segundo elemento da tupla).
Ordenação decrescente
Para ordenar o dicionário Python em ordem decrescente, adicione reverse=True:
d = {'one': 1, 'three': 3, 'five': 5, 'two': 2, 'four': 4}
itens_ordenados_desc = sorted(d.items(), key=lambda x: x[1], reverse=True)
print(itens_ordenados_desc)
# Saída: [('five', 5), ('four', 4), ('three', 3), ('two', 2), ('one', 1)]
TestarOrdenação por critérios complexos
As funções lambda também permitem ordenar dicionário por valor usando critérios mais complexos:
# Ordenar por valor absoluto (útil para números negativos)
d = {'a': -5, 'b': 3, 'c': -8, 'd': 1}
ordenado_abs = dict(sorted(d.items(), key=lambda x: abs(x[1])))
print(ordenado_abs)
# Saída: {'d': 1, 'b': 3, 'a': -5, 'c': -8}
# Ordenar strings por comprimento (valores são strings)
palavras = {'python': 'linguagem', 'js': 'script', 'c': 'compilada'}
ordenado_comprimento = dict(sorted(palavras.items(), key=lambda x: len(x[1])))
print(ordenado_comprimento)
TestarEsta flexibilidade torna as funções lambda ideais para cenários personalizados ao ordenar um dicionário Python por valor.
Resumo
Ordenar um dicionário por valor no Python pode ser feito usando vários métodos, dependendo da versão do Python que você está usando. Nas versões modernas do Python (3.7+), você pode ordenar dicionários diretamente e manter a ordem dos pares chave-valor. Em versões mais antigas, você pode ordenar os itens e então criar um OrderedDict ou converter os itens ordenados de volta em um dicionário.
Para ordenação simples, você pode usar a função sorted() com o parâmetro key definido para dict.get, e para mais controle, você pode usar uma função lambda para especificar o comportamento da ordenação. Seja para ordenar um dicionário Python em ordem crescente ou decrescente, esses métodos ajudarão você a organizar os itens do seu dicionário de forma eficiente.

Cursos de programação gratuitos com certificado
Aprenda a programar e desenvolva soluções para o seu trabalho com Python para alcançar novas oportunidades profissionais. Aqui na Asimov você encontra:
- Conteúdos gratuitos
- Projetos práticos
- Certificados
- +20 mil alunos e comunidade exclusiva
- Materiais didáticos e download de código
Comentários
30xp