Pular para o conteúdo

Como Ordenar um Dicionário no Python

CodeMDD.io

Ordenando um Dicionário Python: Valores, Chaves e Mais

por Ian Currie (Data Structures) (Intermediário)

Você tem um dicionário, mas deseja ordenar os pares chave-valor. Talvez você já tenha tentado passar um dicionário para a função sorted(), mas não obteve os resultados esperados. Neste tutorial, você aprenderá tudo o que precisa saber se quiser ordenar dicionários em Python.

Neste tutorial, você irá:

  • Rever como usar a função sorted()
  • Aprender a obter visões do dicionário para iterar
  • Entender como os dicionários são convertidos em listas durante a ordenação
  • Aprender a especificar uma chave de ordenação para ordenar um dicionário por valor, chave ou atributo aninhado
  • Rever as compreensões de dicionário e o construtor dict() para reconstruir seus dicionários
  • Considerar estruturas de dados alternativas para seus dados de chave-valor

Ao longo do caminho, você também usará o módulo timeit para cronometrar seu código e obter resultados concretos para comparar os diferentes métodos de ordenação de dados de chave-valor. Você também avaliará se um dicionário ordenado é realmente a melhor opção, já que não é um padrão particularmente comum.

Para obter o máximo deste tutorial, você deve conhecer sobre dicionários, listas, tuplas e funções. Com esse conhecimento, você poderá ordenar dicionários até o final deste tutorial. Alguma exposição a funções de ordem superior, como funções lambda, também será útil, mas não é um requisito.

Primeiro, você aprenderá alguns conhecimentos fundamentais antes de tentar ordenar um dicionário em Python.

Redescobrindo a Ordem dos Dicionários em Python

Antes do Python 3.6, a única maneira de manter um dicionário ordenado como uma estrutura de dados era usar a classe OrderedDict a partir do módulo collections. A partir do Python 3.7, essa necessidade desapareceu.

Agora que a ordem é garantida para os dicionários em todas as versões modernas do Python, você pode usar métodos nativos para ordenar suas chaves, valores ou ambos.

Ordenando Dicionários em Python

Existem várias maneiras de ordenar um dicionário em Python. Vamos explorar essas opções passo a passo.

Usando a função sorted()

Uma maneira simples de ordenar um dicionário em Python é usando a função sorted(). Esta função retorna uma nova lista contendo todos os itens do dicionário em ordem.

Aqui está um exemplo que ordena um dicionário pelo valor de cada item em ordem crescente:

dicionario = {'a': 10, 'b': 5, 'c': 15}
dicionario_ordenado = sorted(dicionario.items(), key=lambda x: x[1])
print(dicionario_ordenado)

Saída:

[('b', 5), ('a', 10), ('c', 15)]

Neste exemplo, usamos o método .items() para obter uma lista de tuplas (chave, valor) do dicionário. Em seguida, usamos a função sorted() e especificamos a chave de ordenação como lambda x: x[1], o que significa que estamos ordenando com base no segundo elemento de cada tupla (ou seja, o valor). O resultado é uma lista ordenada de tuplas.

Você também pode definir a ordem de classificação como reversa, passando reverse=True como um parâmetro adicional para a função sorted().

dicionario_reverso = sorted(dicionario.items(), key=lambda x: x[1], reverse=True)
print(dicionario_reverso)

Saída:

[('c', 15), ('a', 10), ('b', 5)]

Neste exemplo, usamos reverse=True para classificar em ordem decrescente com base no valor.

Obtendo Chaves, Valores ou Ambos de um Dicionário

Em alguns casos, você pode querer ordenar apenas as chaves ou apenas os valores de um dicionário, em vez de ordenar o dicionário inteiro.

Para ordenar apenas as chaves de um dicionário, você pode usar a função sorted() com o método .keys():

chaves_ordenadas = sorted(dicionario.keys())
print(chaves_ordenadas)

Saída:

['a', 'b', 'c']

Neste exemplo, usamos a função sorted() para ordenar as chaves do dicionário em ordem alfabética. O resultado é uma lista contendo as chaves ordenadas.

Da mesma forma, se você quiser ordenar apenas os valores de um dicionário, pode usar a função sorted() com o método .values():

valores_ordenados = sorted(dicionario.values())
print(valores_ordenados)

Saída:

[5, 10, 15]

Neste exemplo, usamos a função sorted() para ordenar os valores do dicionário em ordem crescente. O resultado é uma lista contendo os valores ordenados.

Se você quiser obter tanto as chaves quanto os valores do dicionário ordenados, pode usar o método .items() em conjunto com a função sorted():

itens_ordenados = sorted(dicionario.items())
print(itens_ordenados)

Saída:

[('a', 10), ('b', 5), ('c', 15)]

Neste exemplo, usamos a função sorted() para ordenar os itens do dicionário em ordem alfabética por chave. O resultado é uma lista contendo as tuplas (chave, valor) ordenadas.

Entendendo Como o Python Ordena Tuplas

Ao ordenar dicionários em Python, você está na verdade ordenando uma lista de tuplas (chave, valor). É importante entender como o Python classifica tuplas para obter os resultados desejados.

O Python classifica as tuplas com base na ordem dos elementos. Ele primeiro compara o primeiro elemento de cada tupla. Se eles forem iguais, ele avança para comparar o próximo elemento e assim por diante.

Vamos considerar um exemplo:

tupla1 = ('a', 10)
tupla2 = ('b', 5)
tupla3 = ('a', 15)
print(tupla1 < tupla2) # True
print(tupla1 < tupla3) # False

Saída:

True
False

Neste exemplo, a comparação é feita com base no primeiro elemento das tuplas. Como 'a' vem antes de 'b' alfabeticamente, a primeira comparação é verdadeira. No entanto, na segunda comparação, 'a' é igual a 'a', então a segunda comparação se move para o segundo elemento e compara 10 com 15. Como 10 é menor que 15, a segunda comparação é falsa.

É importante entender como as tuplas são comparadas ao ordenar um dicionário com base no valor ou em qualquer outro critério.

Usando o Parâmetro key e Funções Lambda

A função sorted() aceita um parâmetro opcional chamado key, que pode ser usado para especificar uma função de ordenação personalizada.

dicionario_ordenado = sorted(dicionario.items(), key=lambda x: x[1])

Você também pode definir uma função separada para usar como a chave de ordenação. Por exemplo:

def chave_ordenacao(item):
return item[1]
dicionario_ordenado = sorted(dicionario.items(), key=chave_ordenacao)

Ambos os exemplos produzirão o mesmo resultado.

Selecionando um Valor Aninhado com uma Chave de Ordenação

Se você tiver um dicionário aninhado e quiser ordená-lo com base em um valor específico dentro do dicionário aninhado, poderá usar uma chave de ordenação mais complexa.

Por exemplo, suponha que você tenha o seguinte dicionário aninhado:

dicionario_aninhado = {'a': {'idade': 30}, 'b': {'idade': 20}, 'c': {'idade': 40}}

Se você quiser ordenar esse dicionário aninhado pelo valor da chave 'idade', pode definir a chave de ordenação da seguinte forma:

dicionario_ordenado_aninhado = sorted(dicionario_aninhado.items(), key=lambda x: x[1]['idade'])

Neste exemplo, usamos uma função lambda que retorna o valor da chave aninhada 'idade' do dicionário interno como a chave de ordenação.

Convertendo de Volta para um Dicionário

Depois de ordenar um dicionário, você pode querer convertê-lo de volta para um dicionário Python. Você pode fazer isso usando o construtor dict() ou uma compreensão de dicionário.

Para usar o construtor dict(), você precisa passar uma lista de tuplas (chave, valor) ordenadas como argumento:

dicionario_ordenado = dict(sorted(dicionario.items(), key=lambda x: x[1]))
print(dicionario_ordenado)

Saída:

{'b': 5, 'a': 10, 'c': 15}

Neste exemplo, usamos a função sorted() com uma chave de ordenação lambda para obter uma lista de tuplas (chave, valor) ordenada. Em seguida, usamos o construtor dict() para converter a lista de volta para um dicionário.

Você também pode usar uma compreensão de dicionário para obter o mesmo resultado:

dicionario_ordenado = {k: v for k, v in sorted(dicionario.items(), key=lambda x: x[1])}
print(dicionario_ordenado)

Saída:

{'b': 5, 'a': 10, 'c': 15}

Neste exemplo, usamos a sintaxe de compreensão de dicionário ({k: v for k, v in ...}) para criar um dicionário a partir da lista de tuplas ordenadas.

Considerando Questões Estratégicas e de Desempenho

Ao ordenar dicionários em Python, você pode enfrentar questões estratégicas e de desempenho. Aqui estão algumas considerações ao decidir se deseja usar um dicionário ordenado:

Usando Funções Getter Especiais para Aumentar o Desempenho e a Legibilidade

Se você estiver trabalhando com dicionários grandes e precisar realizar várias operações de ordenação, pode considerar o uso de funções getter especiais, como a função operator.itemgetter(), para aumentar o desempenho e a legibilidade.

from operator import itemgetter
getter = itemgetter(1)
dicionario_ordenado = sorted(dicionario.items(), key=getter)

Neste exemplo, usamos a função itemgetter() do módulo operator para criar um getter que retorna o segundo elemento de cada tupla. Em seguida, usamos esse getter como a chave de ordenação ao chamar a função sorted(). Isso pode ser mais eficiente e fácil de ler do que uma função lambda.

Medindo o Desempenho ao Usar itemgetter()

Ao usar a função itemgetter() ou qualquer outra função de ordenação personalizada, é importante medir o desempenho para garantir que você esteja obtendo ganhos reais. O módulo timeit é uma ferramenta útil para isso.

import timeit
from operator import itemgetter
getter = itemgetter(1)
tempo_lambda = timeit.timeit(lambda: sorted(dicionario.items(), key=lambda x: x[1]), number=100000)
tempo_getter = timeit.timeit(lambda: sorted(dicionario.items(), key=getter), number=100000)
print(f"Tempo com lambda: {tempo_lambda} segundos")
print(f"Tempo com getter: {tempo_getter} segundos")

Neste exemplo, usamos o módulo timeit para medir o tempo de execução de 100.000 iterações de cada método de ordenação. Os tempos de execução são impressos em segundos.

Avaliando se Você Quer Usar um Dicionário Ordenado

Ao decidir se deseja usar um dicionário ordenado, é importante avaliar se a ordenação é realmente necessária. Um dicionário é uma estrutura de dados eficiente para realizar operações de pesquisa e inserção rápidas, mas a ordenação pode adicionar sobrecarga e diminuir o desempenho.

Se você precisa acessar os itens do dicionário em uma ordem específica com frequência, então um dicionário ordenado pode ser a escolha certa para você. No entanto, se a ordem não é crítica para suas operações, pode ser mais eficiente manter o dicionário não ordenado e ordená-lo apenas quando necessário.

Comparando o Desempenho de Estruturas de Dados Diferentes

Se você estiver trabalhando com grandes volumes de dados e precisar realizar operações de pesquisa e ordenação regulares, pode ser interessante comparar o desempenho de diferentes estruturas de dados.

Por exemplo, além do dicionário, você pode considerar o uso de outras estruturas, como listas, conjuntos ou tabelas hash.

O módulo timeit pode ser usado para medir o desempenho de diferentes estruturas de dados e operações.

Comparando o Desempenho de Ordenação

Se você estiver trabalhando com grandes volumes de dados e precisar realizar operações de ordenação regulares, também pode ser interessante comparar o desempenho de diferentes métodos de ordenação.

Além disso, você pode usar o módulo timeit para medir o desempenho de cada método de ordenação.

Comparando o Desempenho de Pesquisa

Além de ordenação, a pesquisa é outra operação comum em estruturas de dados. Se você precisar realizar operações de pesquisa regulares, vale a pena comparar o desempenho de diferentes estruturas de dados e métodos de pesquisa.

Conclusão

Em resumo, existem várias maneiras de ordenar um dicionário em Python. Você pode usar a função sorted() para ordenar o dicionário inteiro ou obter apenas as chaves, os valores ou ambos do dicionário ordenado. Você também pode especificar uma chave de ordenação personalizada usando uma função lambda ou uma função getter como a itemgetter() do módulo operator. É possível converter o resultado de volta para um dicionário usando o construtor dict() ou uma compreensão de dicionário.

Ao decidir se deseja usar um dicionário ordenado, é importante considerar questões estratégicas e de desempenho. Você pode usar funções getter especiais para aumentar o desempenho e a legibilidade, medir o desempenho dos métodos de ordenação e avaliar se um dicionário ordenado é realmente necessário. Além disso, pode ser interessante comparar o desempenho de diferentes estruturas de dados e operações para encontrar a solução mais eficiente para suas necessidades.

Com os conhecimentos adquiridos neste tutorial, você agora pode ordenar dicionários em Python e escolher a abordagem mais adequada para suas necessidades.