Pular para o conteúdo

Como ordenar dicionário por valor?

[

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

por Ian Currie

Você tem um dicionário, mas gostaria de ordenar os pares chave-valor. Talvez você 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ê aprenderá:

  • Como usar a função sorted()
  • Como obter views de dicionário para iterar
  • Como os dicionários são convertidos em listas durante a ordenação
  • Como especificar uma chave de ordenação para ordenar um dicionário por valor, chave ou atributo aninhado
  • 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 medir o tempo de execução de seu código e obter resultados concretos 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, pois não é um padrão particularmente comum.

Para aproveitar ao máximo este tutorial, você deve conhecer 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.

(não traduzir) Rediscovering Dictionary Order in Python

Se você quisesse manter um dicionário ordenado como uma estrutura de dados antes do Python 3.6, teria que usar uma alternativa, como a classe OrderedDict do módulo collections. No entanto, a partir do Python 3.7, você não precisará mais dessa alternativa.

(não traduzir) Understand

Ordenando Dicionários em Python

Python fornece várias maneiras de ordenar um dicionário. Vamos explorar cada uma delas.

Usando a função sorted()

A primeira abordagem que iremos explorar é usando a função sorted(), que ordena qualquer sequência em Python, incluindo dicionários.

numbers = {3: "three", 2: "two", 1: "one"}
sorted_numbers = sorted(numbers.items())
print(sorted_numbers)

Neste exemplo, estamos ordenando o dicionário numbers com base em suas chaves. A função sorted() retorna uma lista de tuplas contendo as chaves e seus respectivos valores ordenados. A saída será [(1, 'one'), (2, 'two'), (3, 'three')].

Se você deseja ordenar o dicionário com base em seus valores, pode usar a função sorted() com o parâmetro key e uma função lambda. Veja o exemplo abaixo:

prices = {"apple": 0.5, "banana": 0.25, "orange": 0.75}
sorted_prices = sorted(prices.items(), key=lambda x: x[1])
print(sorted_prices)

Neste exemplo, estamos ordenando o dicionário prices com base em seus valores. A função lambda lambda x: x[1] extrai o segundo elemento de cada tupla (o valor) e o utiliza como critério de ordenação. A saída será [(0.25, 'banana'), (0.5, 'apple'), (0.75, 'orange')].

Obtendo Chaves, Valores ou Ambos de um Dicionário

Às vezes, você pode precisar apenas das chaves ou dos valores de um dicionário. Python fornece métodos para isso.

Para obter todas as chaves de um dicionário, você pode usar o método keys(). Veja o exemplo abaixo:

numbers = {3: "three", 2: "two", 1: "one"}
keys = numbers.keys()
print(keys)

A saída será (3, 2, 1). Observe que o resultado não está ordenado, pois os dicionários são estruturas de dados desordenadas.

Para obter todos os valores de um dicionário, você pode usar o método values(). Veja o exemplo abaixo:

numbers = {3: "three", 2: "two", 1: "one"}
values = numbers.values()
print(values)

A saída será ('three', 'two', 'one'). Novamente, observe que os valores não estão ordenados.

Se você precisar tanto das chaves quanto dos valores de um dicionário, pode usar o método items(). Veja o exemplo abaixo:

numbers = {3: "three", 2: "two", 1: "one"}
items = numbers.items()
print(items)

A saída será [(3, 'three'), (2, 'two'), (1, 'one')]. Os pares chave-valor são retornados como uma lista de tuplas.

Entendendo Como Python Ordena Tuplas

Ao ordenar um dicionário em Python, você provavelmente usará a função sorted() com a função lambda como chave de ordenação. É importante entender como o Python ordena as tuplas para escrever corretamente essa função lambda.

O Python ordena as tuplas comparando seus elementos um a um. Isso significa que, se os primeiros elementos das tuplas forem iguais, o Python comparará os segundos elementos, e assim por diante.

Além disso, o Python compara elementos usando uma ordem lexicográfica. Isso significa que são comparados os caracteres ou valores numéricos em suas posições correspondentes na representação textual ou numérica. Por exemplo, a ordem lexicográfica de duas strings é determinada comparando seus primeiros caracteres e avançando para os seguintes, caso os primeiros sejam iguais.

Se você tiver um dicionário em que as chaves são números inteiros, o Python não terá problemas em ordenar as tuplas corretamente. No entanto, se as chaves forem strings, você pode encontrar resultados inesperados ao usar a função sorted().

Por exemplo, suponha que você tenha o seguinte dicionário:

words = {"apple": 1, "banana": 2, "cherry": 3, "apricot": 4}

Se você usar sorted(words.items()), a saída será [('apricot', 4), ('apple', 1), ('banana', 2), ('cherry', 3)]. Observe que as palavras estão ordenadas alfabeticamente, não numericamente. Isso ocorre porque o Python está comparando as strings usando a ordem lexicográfica.

Para resolver esse problema, você pode usar o parâmetro key da função sorted() com uma função lambda que converte as chaves em números. Veja o exemplo abaixo:

words = {"apple": 1, "banana": 2, "cherry": 3, "apricot": 4}
sorted_words = sorted(words.items(), key=lambda x: int(x[1]))
print(sorted_words)

A saída correta será [(('apple', 1), ('banana', 2), ('cherry', 3), ('apricot', 4))].

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

O parâmetro key da função sorted() permite que você especifique uma função de ordenação personalizada. Essa função será aplicada a cada elemento antes da comparação.

Por exemplo, digamos que você tenha um dicionário com nomes de pessoas e suas idades, e você queira ordenar esse dicionário pelo nome em ordem alfabética. Você pode fazer isso usando o parâmetro key e uma função lambda que extrai o nome de cada elemento. Veja o exemplo abaixo:

people = {"John": 25, "Alice": 30, "Bob": 20}
sorted_people = sorted(people.items(), key=lambda x: x[0])
print(sorted_people)

A saída será [(('Alice', 30), ('Bob', 20), ('John', 25))]. Observe que os elementos são ordenados de acordo com os nomes em ordem alfabética.

Você também pode usar funções lambda mais complexas. Por exemplo, suponha que você tenha um dicionário de pessoas com seus nomes, idades e salários, e você queira ordenar esse dicionário pelo salário em ordem decrescente. Você pode usar o parâmetro key e uma função lambda que extrai o salário de cada elemento de dicionário e o multiplica por -1 para inverter a ordem.

people = {"John": {"age": 30, "salary": 5000}, "Alice": {"age": 25, "salary": 6000}, "Bob": {"age": 35, "salary": 4000}}
sorted_people = sorted(people.items(), key=lambda x: x[1]["salary"] * -1)
print(sorted_people)

A saída será [(('Alice', {'age': 25, 'salary': 6000}), ('John', {'age': 30, 'salary': 5000}), ('Bob', {'age': 35, 'salary': 4000}))]. Observe que os elementos são ordenados de acordo com o salário em ordem decrescente.

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

Em alguns casos, você pode precisar classificar um dicionário com base em um valor aninhado em um nível mais profundo. Podemos usar uma função lambda mais complexa para lidar com essa situação. Veja o exemplo abaixo:

users = {"John": {"age": 25, "address": {"city": "New York"}}, "Alice": {"age": 30, "address": {"city": "Los Angeles"}}, "Bob": {"age": 20, "address": {"city": "Chicago"}}}
sorted_users = sorted(users.items(), key=lambda x: x[1]["address"]["city"])
print(sorted_users)

A saída será [(('Alice', {'age': 30, 'address': {'city': 'Los Angeles'}}), ('Bob', {'age': 20, 'address': {'city': 'Chicago'}}), ('John', {'age': 25, 'address': {'city': 'New York'}}))]. Observe que os elementos são ordenados de acordo com a cidade em ordem alfabética.

Convertendo de Volta para um Dicionário

Após ordenar um dicionário, você pode se perguntar como convertê-lo de volta para sua forma original. Felizmente, Python fornece duas maneiras de fazer isso: compreensões de dicionário e o construtor dict().

Vamos usar o exemplo do dicionário prices novamente:

prices = {"apple": 0.5, "banana": 0.25, "orange": 0.75}
sorted_prices = sorted(prices.items(), key=lambda x: x[1])

Usando uma compreensão de dicionário, podemos converter a lista de tuplas sorted_prices de volta para um dicionário ordenado:

ordered_prices = {key: value for key, value in sorted_prices}
print(ordered_prices)

A saída será {'banana': 0.25, 'apple': 0.5, 'orange': 0.75}.

Alternativamente, podemos usar o construtor dict() convertendo a lista de tuplas sorted_prices de volta para um dicionário:

ordered_prices = dict(sorted_prices)
print(ordered_prices)

A saída será a mesma: {'banana': 0.25, 'apple': 0.5, 'orange': 0.75}.

Considerando Questões Estratégicas e de Desempenho

Ao trabalhar com dicionários, especialmente aqueles com um grande número de elementos, é importante considerar questões estratégicas e de desempenho ao decidir se você deseja ou não ordená-los.

Usar dicionários ordenados pode tornar seu código mais complexo e difícil de entender. Se você só precisa dos pares chave-valor em uma ordem específica em um momento específico, pode ser mais eficiente ordenar esses pares naquele momento específico e, em seguida, trabalhar com eles em sua ordem natural. Isso pode evitar a sobrecarga de ordenar o dicionário repetidamente.

Além disso, ordenar um dicionário pode ter um impacto significativo no desempenho de seu código, principalmente se o dicionário for grande. Ao medir o desempenho do seu código, você pode usar a biblioteca timeit para comparar várias abordagens e escolher a mais eficiente.

No geral, a ordenação de dicionários é uma tarefa poderosa em Python, mas deve ser usada com cuidado e considerando as implicações estratégicas e de desempenho.

Conclusão

Neste tutorial, você aprendeu várias maneiras de ordenar um dicionário em Python.

  • Use a função sorted() para ordenar um dicionário com base em suas chaves ou valores.
  • Use os métodos keys(), values() e items() para obter as chaves, valores ou ambos de um dicionário.
  • Entenda como o Python ordena tuples e use o parâmetro key e funções lambda para especificar uma chave de ordenação personalizada.
  • Considere estruturas de dados alternativas para seus dados chave-valor.
  • Use compreensões de dicionário ou o construtor dict() para converter uma lista de tuplas de volta para um dicionário.

Ao aplicar essas técnicas corretamente, você poderá ordenar dicionários no Python de maneira eficiente e flexível.