Como classificar um dicionário por valor em Python

Introdução

Um dicionário em Python é uma coleção de itens que armazena dados como pares chave-valor. No Python 3.7 e versões posteriores, os dicionários são classificados pela ordem de inserção do item. Nas versões anteriores, eles não eram ordenados.

Neste artigo, veremos como podemos classificar um dicionário com base nos valores que eles contêm.

Classificar dicionário usando um para laço

Podemos classificar um dicionário com a ajuda de um for ciclo. Primeiro, usamos o sorted() função para ordenar os valores do dicionário. Em seguida, percorremos os valores classificados, encontrando as chaves para cada valor. Adicionamos esses pares de valores-chave na ordem classificada em um novo dicionário.

Observação: A classificação não permite reordenar o dicionário no local. Estamos escrevendo os pares ordenados em um dicionário completamente novo e vazio.

dict1 = {1: 1, 2: 9, 3: 4}
sorted_values = sorted(dict1.values()) 
sorted_dict = {}

for i in sorted_values:
    for k in dict1.keys():
        if dict1[k] == i:
            sorted_dict[k] = dict1[k]

print(sorted_dict)

Se você executar isso com o interpretador Python, verá:

{1: 1, 3: 4, 2: 9}

Agora que vimos como classificar com loops, vamos ver uma alternativa mais popular que usa o sorted() função.

Classificar dicionário usando o classificado () função

Anteriormente, usávamos o sorted() função para classificar os valores de uma matriz. Ao ordenar um dicionário, podemos passar mais um argumento para o sorted() funcionar assim: sorted(dict1, key=dict1.get).

Aqui, key é uma função que é chamada em cada elemento antes que os valores sejam comparados para classificação. o get() O método em objetos de dicionário retorna o valor da chave de um dicionário.

A sorted(dict1, key=dict1.get) expressão retornará a lista de chaves cujos valores são classificados em ordem. A partir daí, podemos criar um novo dicionário classificado:

dict1 = {1: 1, 2: 9, 3: 4}
sorted_dict = {}
sorted_keys = sorted(dict1, key=dict1.get)  

for w in sorted_keys:
    sorted_dict[w] = dict1[w]

print(sorted_dict) 

Com o sorted() função reduziu a quantidade de código que tivemos que escrever ao usar for rotações. No entanto, podemos combinar ainda mais sorted() funcionar com o itemgetter() função para uma solução mais sucinta para classificar dicionários por valores.

Classificar dicionário usando o operador Módulo e coletor de itens()

A operator módulo inclui o itemgetter() função. Esta função retorna um objeto que pode ser chamado que retorna um item de um objeto.

Por exemplo, vamos usar itemgetter() para criar um objeto que pode ser chamado que retorna o valor de qualquer dicionário com uma chave que é 2:

import operator

dict1 = {1: 1, 2: 9}
get_item_with_key_2 = operator.itemgetter(2)

print(get_item_with_key_2(dict1))  

Todo dicionário tem acesso ao items() método. Esta função retorna os pares chave-valor de um dicionário como uma lista de tuplas. Podemos classificar a lista de tuplas usando o itemgetter() função para puxar o segundo valor da tupla, ou seja, o valor das chaves no dicionário.

Depois de ordenado, podemos criar um dicionário com base nesses valores:

import operator

dict1 = {1: 1, 2: 9, 3: 4}
sorted_tuples = sorted(dict1.items(), key=operator.itemgetter(1))
print(sorted_tuples)  
sorted_dict = {k: v for k, v in sorted_tuples}

print(sorted_dict) 

Com muito menos esforço, temos um dicionário ordenado por valores!

à medida que o key argumento aceita qualquer função, podemos usar funções lambda para retornar valores de dicionário para que possam ser classificados. Vamos ver como.

Classificar dicionário usando uma função do Lambda

As funções Lambda são funções anônimas ou sem nome em Python. Podemos usar funções lambda para obter o valor de um item do dicionário sem precisar importar o operator módulo para itemgetter(). Se você quiser saber mais sobre lambdas, você pode ler sobre eles em nosso guia para Funções Lambda em Python.

Confira nosso guia prático e prático para aprender Git, com práticas recomendadas, padrões aceitos pelo setor e folha de dicas incluída. Pare de pesquisar comandos Git no Google e realmente aprender -lo!

Vamos classificar um dicionário por valores usando uma função lambda no key argumento de sorted():

dict1 = {1: 1, 2: 9, 3: 4}
sorted_tuples = sorted(dict1.items(), key=lambda item: item[1])
print(sorted_tuples)  
sorted_dict = {k: v for k, v in sorted_tuples}

print(sorted_dict)  

Observe que os métodos que discutimos até agora só funcionam com o Python 3.7 e posterior. Vamos ver o que podemos fazer para versões anteriores do Python.

Retornando um novo dicionário com valores ordenados

Depois de classificar um dicionário por valores, para manter um dicionário classificado em versões do Python anteriores a 3.7, você deve usar o OrderedDict - disponível no collections módulo. Esses objetos são dicionários que mantêm a ordem de inserção.

Aqui está um exemplo de classificação e uso OrderedDict:

import operator
from collections import OrderedDict

dict1 = {1: 1, 2: 9, 3: 4}
sorted_tuples = sorted(dict1.items(), key=operator.itemgetter(1))
print(sorted_tuples)  

sorted_dict = OrderedDict()
for k, v in sorted_tuples:
    sorted_dict[k] = v

print(sorted_dict)  

Conclusão

Este tutorial mostrou como um dicionário pode ser classificado com base em seus valores. Primeiro classificamos um dicionário usando dois loops for. Em seguida, melhoramos nossa classificação usando o sorted() função. Também vimos o itemgetter() função do operator módulo pode tornar nossa solução mais sucinta.

Por fim, adaptamos nossa solução para funcionar em versões do Python inferiores a 3.7.

Variações do sorted() são as mais populares e confiáveis ​​para classificar um dicionário por valores.

Carimbo de hora:

Mais de Abuso de pilha