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()
  • Como classificar um dicionário com o método sorted()\n

    • Como converter a lista resultante em um dicionário
    • Como classificar o dicionário por valor em ordem crescente ou decrescente
  • Conclusão

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!