Classificar dicionário por valor em Python – Como classificar um ditado
Em Python, um dicionário é uma estrutura gorda que não é ordenada por padrão. Então, às vezes, você vai querer classificar dicionários por chave ou valor para facilitar as consultas.
O problema é que classificar um dicionário por valor nunca é uma coisa simples de fazer. Isso porque o Python não tem um método embutido para fazê-lo.
No entanto, descobri uma maneira de classificar dicionários por valor, e é isso que vou mostrar como fazer neste artigo.
O que abordaremos
- Como classificar dados com o método
sorted()
Como funciona o método
sorted()
\n- Parâmetros do método
sorted()
- Parâmetros do método
Como classificar um dicionário com o método sorted()
\n
- Como converter a lista resultante em um dicionário
Como classificar dados com o método sorted()
O método sorted()
classifica dados iteráveis, como listas, tuplas e dicionários. Mas classifica apenas por chave.
O método sorted()
coloca os itens classificados em uma lista. Esse é outro problema que temos de resolver, porque queremos que o dicionário ordenado continue a ser um dicionário.
Por exemplo, sorted()
organizou a lista abaixo em ordem alfabética:
persons = ['Chris', 'Amber', 'David', 'El-dorado', 'Brad', 'Folake']
sortedPersons = sorted(persons)
print(sortedPersons)
# Output: ['Amber', 'Brad', 'Chris', 'David', 'El-dorado', 'Folake']
E o método sorted()
classifica os números na tupla abaixo em ordem crescente:
numbers = (14, 3, 1, 4, 2, 9, 8, 10, 13, 12)
sortedNumbers = sorted(numbers)
print(sortedNumbers)
# Output: [1, 2, 3, 4, 8, 9, 10, 12, 13, 14]
Se você usar o método sorted()
com um dicionário, apenas as chaves serão retornadas e, como de costume, ele estará em uma lista:
my_dict = { 'num6': 6, 'num3': 3, 'num2': 2, 'num4': 4, 'num1': 1, 'num5': 5}
sortedDict = sorted(my_dict)
print(sortedDict)
# ['num1', 'num2', 'num3', 'num4', 'num5', 'num6']
Este não é o comportamento que você quer. Você deseja que o dicionário seja classificado por valor e permaneça um dicionário. É isso que vou mostrar a seguir.
Como funciona o método sorted()
Para classificar um dicionário, ainda vamos usar a função ordenada, mas de uma forma mais complicada. Não se preocupe, vou explicar tudo o que você precisa saber.
Como ainda vamos usar o método sorted(),
então é hora de explicar o método sorted()
em detalhes.
Parâmetros do método sorted()
O método sorted()
pode aceitar até 3 parâmetros:
-
iterável – os dados a serem repetidos. Pode ser uma tupla, lista ou dicionário.
key – um valor opcional, a função que ajuda você a executar uma operação de classificação personalizada.
reverso – outro valor opcional. Ele ajuda você a organizar os dados classificados em ordem crescente ou decrescente
Se você adivinhar certo, o parâmetro chave é o que passaremos para o método sorted()
para classificar o dicionário por valor.
Agora, é hora de classificar nosso dicionário por valor e garantir que ele continue sendo um dicionário.
Como classificar um dicionário com o método sorted()
Para classificar corretamente um dicionário por valor com o método sorted(),
você terá que fazer o seguinte:
- passar o dicionário para o método
sorted()
como o primeiro valor - Use o método
items()
no dicionário para recuperar suas chaves e valores - Escreva uma função do Lambda para obter os valores recuperados com o método
item()
Aqui está um exemplo:
footballers_goals = {'Eusebio': 120, 'Cruyff': 104, 'Pele': 150, 'Ronaldo': 132, 'Messi': 125}
sorted_footballers_by_goals = sorted(footballers_goals.items(), key=lambda x:x[1])
print(sorted_footballers_by_goals)
Como eu disse anteriormente, temos que obter esses valores do dicionário para que possamos classificar o dicionário por valores. É por isso que você pode ver 1 na função lambda.
1 representa os índices dos valores. As chaves são 0. Lembre-se que um programador começa a contar a partir de 0, não de 1.
Com esse código acima, obtive o resultado abaixo:
# [('Cruyff', 104), ('Eusebio', 120), ('Messi', 125), ('Ronaldo', 132), ('Pele', 150)]
Aqui está o código completo para que você não fique confuso:
footballers_goals = {'Eusebio': 120, 'Cruyff': 104, 'Pele': 150, 'Ronaldo': 132, 'Messi': 125}
sorted_footballers_by_goals = sorted(footballers_goals.items(), key=lambda x:x[1])
print(sorted_footballers_by_goals)
# [('Cruyff', 104), ('Eusebio', 120), ('Messi', 125), ('Ronaldo', 132), ('Pele', 150)]
Você pode ver que o dicionário foi classificado por valores em ordem crescente. Você também pode classificá-lo em ordem decrescente. Mas vamos analisar isso mais tarde, porque ainda temos um problema com o resultado que obtivemos.
O problema é que o dicionário já não é um dicionário. As chaves e valores individuais foram colocados em uma tupla e posteriormente condensados em uma lista. Lembre-se de que tudo o que você obtém como resultado do método sorted()
é colocado em uma lista.
Conseguimos classificar os itens no dicionário por valor. O que resta é convertê-lo de volta em um dicionário.
Como converter a lista resultante em um dicionário
Para converter a lista resultante em um dicionário, você não precisa escrever outra função complicada ou um loop. Você só precisa passar a variável salvando a lista resultante para o método dict(
).
converted_dict = dict(sorted_footballers_by_goals)
print(converted_dict)
# Output: {'Cruyff': 104, 'Eusebio': 120, 'Messi': 125, 'Ronaldo': 132, 'Pele': 150}
Lembre-se que salvamos o dicionário classificado na variável chamada sorted_footballers_by_goals
, então é a variável que temos que passar para dict()
.
O código completo tem esta aparência:
footballers_goals = {'Eusebio': 120, 'Cruyff': 104, 'Pele': 150, 'Ronaldo': 132, 'Messi': 125}
sorted_footballers_by_goals = sorted(footballers_goals.items(), key=lambda x:x[1])
converted_dict = dict(sorted_footballers_by_goals)
print(converted_dict)
# Output: {'Cruyff': 104, 'Eusebio': 120, 'Messi': 125, 'Ronaldo': 132, 'Pele': 150}
É isso! Conseguimos classificar os itens no dicionário e convertê-los de volta em um dicionário. Acabamos de comer o nosso bolo e comemos também!
Como classificar o dicionário por valor em ordem crescente ou decrescente
Lembre-se de que o método sorted()
aceita um terceiro valor chamado reverse
.
reverso
com um valor de True
organizará o dicionário classificado em ordem decrescente.
footballers_goals = {'Eusebio': 120, 'Cruyff': 104, 'Pele': 150, 'Ronaldo': 132, 'Messi': 125}
sorted_footballers_by_goals = sorted(footballers_goals.items(), key=lambda x:x[1], reverse=True)
converted_dict = dict(sorted_footballers_by_goals)
print(converted_dict)
# Output: {'Pele': 150, 'Ronaldo': 132, 'Messi': 125, 'Eusebio': 120, 'Cruyff': 104}
Você pode ver que a saída é revertida porque passamos reverse=True
para o método sorted(
).
Se você não definir reverse
ou definir seu valor como false, o dicionário será organizado em ordem crescente. Esse é o padrão.
Conclusão
Parabéns;. Agora você pode classificar um dicionário por valor, apesar de não ter um método ou função interna para usar em Python.
No entanto, há algo que me despertou a curiosidade quando me preparava para escrever este artigo. Lembre-se que fomos capazes de usar sorted()
diretamente em um dicionário. Isso nos deu uma lista como resultado, embora só tenhamos as chaves e não os valores.
E se convertermos essa lista em um dicionário com o método dict(
)? Acha que podemos obter o resultado desejado? Vejamos:
my_dict = { 'num6': 6, 'num3': 3, 'num2': 2, 'num4': 4, 'num1': 1, 'num5': 5}
sortedDict = sorted(my_dict)
converted_dict = dict(sortedDict)
print(converted_dict)
"""
Output:
dict_by_value.py
Traceback (most recent call last):
File "sort_dict_by_value.py", line 17, in <module>
converted_dict = dict(sortedDict)
ValueError: dictionary update sequence element #0 has length 4; 2 is required
"""
Recebemos um erro! Isso porque se você quiser criar um dicionário a partir de uma lista, você tem que usar a compreensão do dicionário. E se você usar a compreensão de dicionário para esse tipo de dados, terá que especificar um valor para todas as entradas. Isso desafiaria o propósito de classificar um dicionário por valor, então não é o que queremos.
Se você quiser saber mais sobre compreensão de dicionário, você deve ler este artigo.
Obrigado pela leitura!