Pular para o conteúdo

Como classificar valores de um dicionário Python?

[

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

por Ian Currie

Você tem um dicionário, mas gostaria de 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á:

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

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

Para tirar o máximo proveito deste tutorial, você deve ter conhecimento sobre dicionários, listas, tuplas e funções. Com esse conhecimento, você poderá ordenar dicionários ao 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

Se você quisesse manter um dicionário ordenado como uma estrutura de dados antes dessa garantia, precisava usar a classe OrderedDict do módulo collections. No entanto, a partir do Python 3.7, a garantia de ordem de inserção significa que você pode simplesmente usar um dicionário comum se precisar manter a ordem dos pares chave-valor.

Aqui está um exemplo que demonstra essa ordenação de um dicionário:

colors = {"red": 2, "blue": 1, "green": 3}
sorted_colors = sorted(colors.items(), key=lambda x: x[1])
print(sorted_colors)

Na saída, você verá:

[('blue', 1), ('red', 2), ('green', 3)]

Como você pode ver, o dicionário colors foi ordenado de acordo com os valores, resultando em uma lista de pares chave-valor ordenados.


Ordenando Dicionários em Python

Usando a função sorted()

Uma maneira simples de ordenar um dicionário é usando a função sorted(). Essa função retorna uma nova lista contendo os pares chave-valor do dicionário, ordenados pelo valor padrão:

my_dict = {"z": 3, "a": 1, "b": 2}
sorted_dict = sorted(my_dict.items())
print(sorted_dict)

A saída será:

[('a', 1), ('b', 2), ('z', 3)]

Ao usar a função sorted(), os pares chave-valor são retornados em ordem lexicográfica pela chave. Observe que a função sorted() retorna uma lista de tuplas e não um dicionário. Se você precisar de um novo dicionário ordenado, poderá criar um usando o construtor dict() e a lista de tuplas retornada pela função sorted():

my_dict = {"z": 3, "a": 1, "b": 2}
sorted_tuples = sorted(my_dict.items())
sorted_dict = dict(sorted_tuples)
print(sorted_dict)

O resultado será o mesmo:

{'a': 1, 'b': 2, 'z': 3}

Dessa forma, você obtém um novo dicionário ordenado pelo valor padrão da função sorted().

Obtendo Chaves, Valores ou Ambos de um Dicionário

O método items() de um dicionário retorna uma visão (view) de todos os pares chave-valor. Uma visão é uma representação dinâmica dos dados em um dicionário que permite iterar sobre eles.

Usando essa visão, você pode selecionar apenas as chaves, apenas os valores ou ambos para serem usados na ordenação:

my_dict = {"z": 3, "a": 1, "b": 2}
# Ordenar por chaves
sorted_dict_keys = sorted(my_dict.keys())
# Ordenar por valores
sorted_dict_values = sorted(my_dict.values())
# Ordenar por chaves e valores
sorted_dict_items = sorted(my_dict.items())
print(sorted_dict_keys)
print(sorted_dict_values)
print(sorted_dict_items)

A saída será:

['a', 'b', 'z']
[1, 2, 3]
[('a', 1), ('b', 2), ('z', 3)]

Ao usar o método keys(), values() ou items() em um dicionário, você obtém uma visão dos dados que pode ser passada para a função sorted() para obter uma lista ordenada.

Entendendo como Python Ordena Tuplas

Ao ordenar um dicionário, é importante entender como o Python ordena as tuplas. Cada tupla é ordenada comparando os elementos em ordem crescente e emparelhando-os um por um. Se os elementos forem iguais, o próximo elemento da tupla será comparado e assim por diante.

Por exemplo, considere o seguinte código:

tuples = [("a", 1), ("b", 2), ("a", 3)]
sorted_tuples = sorted(tuples)
print(sorted_tuples)

A saída será:

[('a', 1), ('a', 3), ('b', 2)]

Observe que quando o primeiro elemento de duas tuplas é igual, o segundo elemento é usado para determinar a ordem. Isso ocorre porque o Python compara os elementos um por um.

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

Para controlar a ordenação de um dicionário, você pode especificar uma chave de ordenação usando o parâmetro key da função sorted(). A chave de ordenação é uma função que recebe um elemento da sequência a ser ordenada e retorna um valor para comparar e ordenar.

Por exemplo, para ordenar um dicionário pelo valor de suas chaves, você pode usar o seguinte código:

my_dict = {"z": 3, "a": 1, "b": 2}
sorted_dict = sorted(my_dict.items(), key=lambda x: x[0])
print(sorted_dict)

A saída será:

[('a', 1), ('b', 2), ('z', 3)]

Ao usar a função lambda com o parâmetro key, você especifica que deseja ordenar o dicionário pelo primeiro elemento de cada tupla (ou seja, a chave).

Da mesma forma, você pode ordenar um dicionário pelos valores das chaves, passando x[1] como a função lambda:

my_dict = {"z": 3, "a": 1, "b": 2}
sorted_dict = sorted(my_dict.items(), key=lambda x: x[1])
print(sorted_dict)

A saída será:

[('a', 1), ('b', 2), ('z', 3)]

Neste caso, você especifica que deseja ordenar o dicionário pelo segundo elemento de cada tupla (ou seja, o valor).

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

Se o valor que você deseja usar para ordenação estiver aninhado dentro de uma estrutura de dados mais complexa (como uma lista ou dicionário), você pode usar uma função lambda para selecionar esse valor.

Por exemplo, considere o seguinte dicionário aninhado:

my_dict = {"z": {"value": 3}, "a": {"value": 1}, "b": {"value": 2}}

Se você quiser ordenar o dicionário pelo valor aninhado usando a chave value, você pode fazer o seguinte:

sorted_dict = sorted(my_dict.items(), key=lambda x: x[1]["value"])

Ao passar x[1]["value"] como a função lambda, você especifica que deseja ordenar o dicionário pelo valor do elemento value em cada chave (ou seja, o valor aninhado).

Convertendo de Volta para um Dicionário

Depois de ordenar um dicionário usando a função sorted(), você obtém uma lista de tuplas. Para converter essa lista de volta para um dicionário, você pode usar o construtor dict() em conjunto com a lista ordenada:

my_dict = {"z": 3, "a": 1, "b": 2}
sorted_tuples = sorted(my_dict.items())
sorted_dict = dict(sorted_tuples)
print(sorted_dict)

A saída será:

{'a': 1, 'b': 2, 'z': 3}

Dessa forma, você reconstrói um novo dicionário ordenado a partir da lista de tuplas retornada pela função sorted().


Considerando Questões Estratégicas e de Desempenho

Ao ordenar um dicionário, é importante considerar tanto as questões estratégicas quanto as de desempenho. A escolha do método de ordenação correto pode afetar a legibilidade do código, a facilidade de manutenção e o desempenho da execução.

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

Ao ordenar um dicionário, você pode usar funções especiais para melhorar tanto o desempenho quanto a legibilidade do código. Uma dessas funções é a itemgetter() do módulo operator, que permite obter um item específico de um objeto.

Por exemplo, em vez de usar uma função lambda para selecionar um valor aninhado em um dicionário:

sorted_dict = sorted(my_dict.items(), key=lambda x: x[1]["value"])

Você pode usar a função itemgetter() para obter o mesmo resultado:

from operator import itemgetter
sorted_dict = sorted(my_dict.items(), key=itemgetter(1, "value"))

Dessa forma, seu código fica mais legível e, em alguns casos, pode ter um desempenho melhor.

Medindo o Desempenho ao Usar itemgetter()

Para medir o desempenho ao usar a função itemgetter() em comparação com uma função lambda, você pode usar o módulo timeit. Por exemplo, para medir o tempo necessário para ordenar um dicionário usando uma função lambda:

from timeit import timeit
my_dict = {"z": {"value": 3}, "a": {"value": 1}, "b": {"value": 2}}
def sort_dict_lambda():
sorted_dict = sorted(my_dict.items(), key=lambda x: x[1]["value"])
print(timeit(sort_dict_lambda, number=1000000))

Este código mede o tempo necessário para executar a função sort_dict_lambda() 1.000.000 de vezes e imprime o resultado.

Em seguida, você pode medir o tempo necessário para ordenar o mesmo dicionário usando a função itemgetter():

from timeit import timeit
from operator import itemgetter
my_dict = {"z": {"value": 3}, "a": {"value": 1}, "b": {"value": 2}}
def sort_dict_itemgetter():
sorted_dict = sorted(my_dict.items(), key=itemgetter(1, "value"))
print(timeit(sort_dict_itemgetter, number=1000000))

Comparando os dois tempos medidos, você pode ter uma noção do desempenho relativo entre os dois métodos de ordenação.

Decidindo se Deseja Usar um Dicionário Ordenado

Embora ordenar um dicionário possa ser útil em algumas situações, é importante considerar se é realmente necessário. Em muitos casos, a ordem dos pares chave-valor em um dicionário não é relevante para o problema que você está resolvendo.

Além disso, a ordenação de um dicionário pode ter um impacto negativo no desempenho, especialmente com dicionários maiores. Portanto, é importante avaliar o trade-off entre a legibilidade do código e o desempenho da execução ao decidir se deseja ou não usar um dicionário ordenado.

Comparando o Desempenho de Diferentes Estruturas de Dados

Se você estiver lidando com um grande volume de dados chave-valor e o desempenho for uma consideração crítica, pode valer a pena comparar o desempenho de diferentes estruturas de dados disponíveis em Python.

Por exemplo, você pode considerar o uso de estruturas de dados como OrderedDict ou Pandas DataFrame para armazenar seus dados. Essas estruturas de dados são otimizadas para operações de ordenação e podem fornecer melhor desempenho em certas situações.

Ao comparar o desempenho de diferentes estruturas de dados, é importante levar em consideração o tamanho dos dados, as operações que você realiza com eles e as características específicas do problema que você está resolvendo.

Comparando o Desempenho da Ordenação

Além do desempenho das estruturas de dados, você também pode comparar o desempenho dos diferentes métodos de ordenação disponíveis em Python. Por exemplo, você pode comparar os tempos de execução da função sorted() com a função itemgetter() para diferentes tamanhos de dicionário.

Ao medir o desempenho, você pode obter informações valiosas sobre a eficiência relativa dos diferentes algoritmos e métodos de ordenação em Python.

Comparando o Desempenho das Pesquisas

Outro aspecto a considerar ao trabalhar com dados chave-valor é o desempenho das operações de pesquisa. Dependendo das suas necessidades, pode ser necessário ajustar sua implementação para otimizar as operações de pesquisa em vez das operações de ordenação.

Comparar o desempenho das pesquisas em diferentes estruturas de dados pode ajudá-lo a tomar decisões informadas sobre a estrutura de dados a ser usada para seus dados chave-valor.


Conclusão

Ordenar um dicionário em Python não é tão simples quanto parece à primeira vista. No entanto, com as informações fornecidas neste tutorial, você está equipado com todos os conhecimentos e ferramentas necessários para ordenar dicionários em Python de diferentes maneiras.

Lembre-se de considerar tanto as questões estratégicas quanto as de desempenho ao determinar o método de ordenação mais adequado para o seu caso de uso. A ordem dos pares chave-valor em um dicionário pode não ser relevante em muitos casos, e a ordenação de grandes dicionários pode afetar negativamente o desempenho.

Explore e experimente diferentes métodos de ordenação e estruturas de dados para encontrar a solução mais eficiente e adequada para as suas necessidades.


Compartilhe este tutorial com seus amigos:

  • Por email