Pular para o conteúdo

Como ordenar um dicionário por valor em Python?

[

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

por Ian Currie data-structures intermediário

Neste tutorial, você aprenderá:

  • Rever como usar a função sorted()
  • Aprender como obter visões de dicionário para iterar
  • Entender como os dicionários são convertidos para 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 as compreensões de dicionários 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 tangíveis para comparar os 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 muito comum.

Em primeiro lugar, 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 disso, você geralmente usaria a classe OrderedDict. Agora, com a garantia de ordem de dicionários regulares, isso se tornou menos comum. No entanto, ainda é uma opção útil para muitos casos de uso.

Mas e se você quiser ordenar um dicionário com base em suas chaves ou valores? O Python fornece maneiras simples de fazer isso usando a função sorted(). Vamos explorar essas opções agora.

Ordenando Dicionários em Python

Usando a função sorted()

A função sorted() é uma poderosa ferramenta em Python que pode ser usada para classificar várias estruturas de dados, incluindo listas, tuplas, conjuntos e até dicionários. Para classificar um dicionário, você pode simplesmente passá-lo como argumento para a função sorted().

Por exemplo, vamos considerar o seguinte dicionário com pares chave-valor:

my_dict = {'b': 2, 'a': 1, 'd': 4, 'c': 3}

Se você quiser classificar esse dicionário por suas chaves em ordem alfabética, você pode fazer o seguinte:

sorted_dict = sorted(my_dict)

Isso resultará em uma lista ordenada das chaves do dicionário: ['a', 'b', 'c', 'd'].

A função sorted() não modifica o dicionário original. Em vez disso, retorna uma nova lista com os elementos classificados.

Você também pode usar a função sorted() para classificar o dicionário com base em seus valores. Para fazer isso, você precisa passar um argumento adicional para a função key. Veja um exemplo:

sorted_dict_by_value = sorted(my_dict, key=my_dict.get)

Isso classificará o dicionário com base em seus valores em ordem crescente, resultando na seguinte lista de chaves: ['a', 'b', 'c', 'd'].

Obtendo Chaves, Valores ou Ambos de um Dicionário

Além de classificar um dicionário, você também pode precisar obter apenas suas chaves, valores ou ambos. Em Python, você pode fazer isso usando os métodos keys(), values() e items(), respectivamente.

Por exemplo, vamos considerar o seguinte dicionário:

my_dict = {'name': 'Alice', 'age': 25, 'city': 'New York'}

Para obter todas as chaves do dicionário, você pode usar o método keys() da seguinte forma:

dict_keys = my_dict.keys()

Isso retornará uma lista de chaves: ['name', 'age', 'city'].

Da mesma forma, para obter todos os valores do dicionário, você pode usar o método values():

dict_values = my_dict.values()

Isso retornará uma lista de valores: ['Alice', 25, 'New York'].

E se você quiser obter todos os pares chave-valor do dicionário? Você pode usar o método items():

dict_items = my_dict.items()

Isso retornará uma lista de pares chave-valor: [('name', 'Alice'), ('age', 25), ('city', 'New York')].

Você pode combinar esses métodos com a função sorted() para classificar as chaves, valores ou pares chave-valor do dicionário, conforme necessário. Por exemplo, para classificar as chaves do dicionário em ordem alfabética, você pode fazer o seguinte:

sorted_keys = sorted(my_dict.keys())

Isso retornará uma lista ordenada das chaves do dicionário: ['age', 'city', 'name'].

Da mesma forma, para classificar os valores do dicionário em ordem crescente, você pode fazer o seguinte:

sorted_values = sorted(my_dict.values())

Isso retornará uma lista ordenada dos valores do dicionário: [25, 'Alice', 'New York'].

Você também pode classificar os pares chave-valor do dicionário com base nas chaves ou valores. Por exemplo, para classificar os pares chave-valor com base nas chaves em ordem alfabética, você pode fazer o seguinte:

sorted_items_by_key = sorted(my_dict.items(), key=lambda x: x[0])

Isso resultará em uma lista ordenada dos pares chave-valor: [('age', 25), ('city', 'New York'), ('name', 'Alice')].

E para classificar os pares chave-valor com base nos valores em ordem crescente, você pode fazer o seguinte:

sorted_items_by_value = sorted(my_dict.items(), key=lambda x: x[1])

Isso resultará em uma lista ordenada dos pares chave-valor: [('name', 'Alice'), ('age', 25), ('city', 'New York')].

Compreendendo Como o Python Ordena Tuplas

Ao usar a função sorted() ou o método sort() para classificar um dicionário, o Python usa a ordem das tuplas compostas por chaves e valores. Em outras palavras, as tuplas são usadas como chaves para classificar os pares chave-valor do dicionário.

Mas como o Python compara as tuplas para determinar a ordem? Ele compara os elementos das tuplas da esquerda para a direita e usa a ordem lexicográfica. Isso significa que o Python compara o primeiro elemento da tupla. Se eles forem iguais, ele passa para o próximo elemento e assim por diante. Se todos os elementos forem iguais, as tuplas são consideradas iguais. Caso contrário, a primeira tupla é considerada menor ou maior, dependendo da comparação dos primeiros elementos diferentes.

Por exemplo, considere as seguintes tuplas:

t1 = (1, 2)
t2 = (1, 3)
t3 = (2, 1)

A ordem correta dessas tuplas é t1 < t2 < t3, porque o primeiro elemento de t1 é igual ao primeiro elemento de t2, mas o segundo elemento de t1 é menor que o segundo elemento de t2. E t2 < t3 porque o primeiro elemento de t2 é menor que o primeiro elemento de t3.

No caso de pares chave-valor do dicionário, o Python compara as tuplas (chave, valor) para determinar a ordem. Isso significa que, no caso de chaves iguais, o Python usará os valores para determinar a ordem. Isso é útil ao classificar um dicionário com base em seus valores.

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

Ao classificar um dicionário com base em seus valores, você pode especificar uma função de chave de classificação usando o parâmetro key da função sorted() ou do método sort(). Essa função de chave recebe um elemento do dicionário e retorna um valor usado para ordenar os elementos.

Uma forma comum de especificar uma função de chave é usando uma função lambda. As funções lambda são funções anônimas de uma linha que podem ser usadas como valores ou argumentos de função.

Por exemplo, digamos que você tenha um dicionário com nomes de países como chaves e populações como valores:

populations = {'China': 1439323776,
'India': 1380004385,
'United States': 331002651,
'Indonesia': 273523615,
'Pakistan': 220892340}

Se você quiser classificar esse dicionário por população em ordem decrescente, você pode fazer o seguinte:

sorted_populations = sorted(populations, key=lambda x: populations[x], reverse=True)

Neste exemplo, a função lambda x: populations[x] é usada como função de chave. Ela recebe um país x e retorna a população desse país. A lista retornada por sorted() será uma lista de países ordenados por população decrescente: ['China', 'India', 'United States', 'Indonesia', 'Pakistan'].

Repare que também foi usado o parâmetro reverse=True para obter a ordem decrescente. Por padrão, a função sorted() retorna a lista em ordem crescente.

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

E se você tiver um dicionário com valores aninhados e quiser classificar o dicionário com base nesses valores? Você pode fazer isso usando uma chave de ordenação composta.

Por exemplo, suponha que você tenha o seguinte dicionário de estudantes com seus nomes e idades:

students = {'Alice': {'age': 25, 'grade': 'A'},
'Bob': {'age': 21, 'grade': 'B'},
'Charlie': {'age': 23, 'grade': 'B'},
'David': {'age': 22, 'grade': 'A'}}

Agora, vamos dizer que você queira classificar o dicionário com base nas idades dos alunos em ordem crescente. Para fazer isso, você pode usar uma função de chave de ordenação composta:

sorted_students = sorted(students, key=lambda x: students[x]['age'])

Neste exemplo, a função de chave lambda x: students[x]['age'] extrai a idade de cada aluno x. A lista retornada por sorted() será uma lista de nomes de alunos ordenados por idade em ordem crescente: ['Bob', 'David', 'Charlie', 'Alice'].

Você pode usar essa técnica para classificar um dicionário com base em qualquer valor aninhado, desde que você possa acessá-lo usando as chaves do dicionário.

Convertendo de Volta para um Dicionário

Após classificar um dicionário, você pode querer converter a lista resultante de volta em um dicionário. Você pode fazer isso usando a função dict() e uma compreensão de dicionário.

Por exemplo, digamos que você tenha uma lista ordenada de pares chave-valor e queira reconstruir o dicionário original:

sorted_dict_items = [('a', 1), ('b', 2), ('c', 3), ('d', 4)]
sorted_dict = dict(sorted_dict_items)

Isso retornará um dicionário ordenado: {'a': 1, 'b': 2, 'c': 3, 'd': 4}.

Você também pode aplicar esse método para reconstruir um dicionário ordenado com base nas chaves ou valores classificados anteriormente.

Considerando Questões Estratégicas e de Desempenho

Ao ordenar um dicionário em Python, pode haver algumas questões estratégicas e de desempenho que você deve considerar.

Primeiro, usar a função sorted() ou o método sort() para classificar um dicionário requer que o dicionário seja convertido em uma lista. Isso pode ocupar mais espaço na memória, especialmente se o dicionário for grande. Portanto, você deve ter cuidado ao trabalhar com dicionários grandes e considerar o uso de outras estruturas de dados, como um OrderedDict, se você precisar da ordem dos elementos.

Em segundo lugar, a escolha da função de chave de ordenação pode afetar o desempenho da classificação. Por exemplo, usar uma função lambda como chave pode ser conveniente, mas também pode introduzir um pequeno custo de desempenho. Se o desempenho for uma preocupação para você, você pode considerar o uso de funções getter especiais, como itemgetter(), que são otimizadas para acesso de atributos de objetos.

Outra questão de desempenho a considerar é o tempo de execução da classificação. A classificação de um dicionário pode levar algum tempo, especialmente se o dicionário for grande. Se o desempenho for um problema para você, é importante medir o tempo de execução do seu código e comparar o desempenho de diferentes métodos de classificação e estruturas de dados.

Conclusão

Neste tutorial, você aprendeu como classificar um dicionário em Python. Você revisou como usar a função sorted(), como obter chaves, valores ou ambos de um dicionário, como Python classifica tuplas, como usar o parâmetro key e funções lambda, como selecionar valores aninhados com uma chave de ordenação, como converter de volta para um dicionário e como considerar questões estratégicas e de desempenho ao ordenar um dicionário.

Agora você tem todas as ferramentas necessárias para começar a classificar seus próprios dicionários em Python. Divirta-se explorando diferentes métodos e estratégias de classificação, e lembre-se de considerar suas necessidades específicas e o desempenho do seu código ao escolher uma abordagem.