Pular para o conteúdo

Como usar dicionários ordenados em Python?

[

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

por Ian Currie data-structures intermediário

Neste tutorial, você vai:

  • Rever como usar a função sorted()
  • Aprender como obter visões de dicionário para iterar
  • Compreender como os dicionários são convertidos em 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ário 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 particularmente comum.

Antes de tentar ordenar um dicionário em Python, você aprenderá alguns conhecimentos fundamentais.

Redescobrindo a Ordem dos Dicionários em Python

Se você desejava manter um dicionário ordenado como uma estrutura de dados antes disso, precisava usar um OrderedDict da biblioteca collections. No entanto, com as mudanças mais recentes na implementação padrão dos dicionários no Python, você não precisa mais fazer isso.

Agora que você está familiarizado com a ordem dos dicionários no Python, vamos explorar várias maneiras de ordenar um dicionário usando a função sorted().

Ordenando Dicionários em Python

Usando a função sorted()

A maneira mais simples de ordenar um dicionário em Python é usando a função sorted(). A função sorted() retorna uma lista de elementos classificados em ordem crescente.

Para classificar um dicionário, você precisa passar seu método .items() para a função sorted():

data = {"apple": 5, "banana": 2, "cherry": 10}
sorted_data = sorted(data.items())
print(sorted_data)

Este código classificará o dicionário data por suas chaves em ordem alfabética e retornará a lista de pares chave-valor ordenada.

Obtendo Chaves, Valores ou Ambos de um Dicionário

Ao usar a função sorted(), você pode controlar quais informações do dicionário serão usadas para ordenar os elementos.

Para classificar apenas as chaves em um dicionário, você pode passar o método .keys() para a função sorted():

data = {"apple": 5, "banana": 2, "cherry": 10}
sorted_keys = sorted(data.keys())
print(sorted_keys)

Isso retornará uma lista de chaves ordenadas em ordem alfabética.

Para classificar apenas os valores do dicionário, você pode passar o método .values() para a função sorted():

data = {"apple": 5, "banana": 2, "cherry": 10}
sorted_values = sorted(data.values())
print(sorted_values)

Isso retornará uma lista de valores ordenados em ordem crescente.

Se você deseja obter tanto as chaves quanto os valores do dicionário, pode usar o método .items():

data = {"apple": 5, "banana": 2, "cherry": 10}
sorted_items = sorted(data.items())
print(sorted_items)

Isso retornará uma lista de tuplas contendo pares chave-valor, ordenadas por chave em ordem alfabética.

Entendendo Como o Python Classifica Tuplas

Ao classificar um dicionário usando a função sorted(), o Python classificará os elementos com base em uma chave de classificação. No caso dos dicionários, a chave de classificação será cada par chave-valor representado como uma tupla.

Por padrão, o Python classificará as tuplas com base em sua primeira posição, ou seja, a chave. Isso significa que, ao classificar um dicionário, o Python considerará apenas suas chaves para determinar a ordem dos elementos.

Por exemplo, se você tiver o seguinte dicionário:

data = {"apple": 5, "banana": 2, "cherry": 10}

A chave de classificação para cada par chave-valor será uma tupla contendo a chave e o valor:

("apple", 5)
("banana", 2)
("cherry", 10)

Ao classificar essas tuplas, o Python usará apenas as chaves para determinar a ordem. Portanto, a lista ordenada resultante seria:

[("apple", 5), ("banana", 2), ("cherry", 10)]

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

Se você quiser classificar um dicionário com base em seus valores ou em algum outro atributo aninhado, precisará usar o parâmetro key da função sorted(). O parâmetro key permite especificar uma função de chave de ordenação personalizada que será usada para classificar os elementos.

Por exemplo, se você quiser classificar o dicionário data por seus valores em ordem decrescente, pode usar a seguinte função lambda como chave de classificação:

data = {"apple": 5, "banana": 2, "cherry": 10}
sorted_data = sorted(data.items(), key=lambda x: x[1], reverse=True)
print(sorted_data)

A função lambda recebe cada par chave-valor como entrada e retorna o segundo elemento da tupla (ou seja, o valor) como chave de classificação. O parâmetro reverse=True é usado para classificar os elementos em ordem decrescente.

Isso retornará a lista de pares chave-valor do dicionário data classificados por valor em ordem descendente:

[("cherry", 10), ("apple", 5), ("banana", 2)]

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

Em alguns casos, você pode ter um dicionário com valores aninhados, como um dicionário de dicionários. Nesse caso, você pode usar uma chave de ordenação personalizada para selecionar um valor aninhado específico para a classificação.

Por exemplo, se você tiver o seguinte dicionário de dicionários:

data = {"apple": {"quantity": 5}, "banana": {"quantity": 2}, "cherry": {"quantity": 10}}

E você quiser classificar o dicionário data com base na quantidade de cada fruta, você pode usar a seguinte função lambda como chave de classificação:

data = {"apple": {"quantity": 5}, "banana": {"quantity": 2}, "cherry": {"quantity": 10}}
sorted_data = sorted(data.items(), key=lambda x: x[1]["quantity"], reverse=True)
print(sorted_data)

Esta função lambda seleciona o valor aninhado "quantity" de cada par chave-valor e o usa como chave de classificação. O resultado será a lista de pares chave-valor ordenada por quantidade em ordem decrescente:

[("cherry", {"quantity": 10}), ("apple", {"quantity": 5}), ("banana", {"quantity": 2})]

Convertendo de Volta para um Dicionário

Depois de classificar um dicionário, você pode querer recuperar a estrutura de dicionário original. Para fazer isso, você pode usar a função dict() junto com a lista ordenada de pares chave-valor.

Por exemplo, suponha que você tenha a seguinte lista ordenada de pares chave-valor:

sorted_data = [("cherry", 10), ("apple", 5), ("banana", 2)]

Você pode converter esta lista de volta para um dicionário usando a função dict():

original_data = dict(sorted_data)
print(original_data)

Isso retornará o dicionário original antes de ser classificado:

{"cherry": 10, "apple": 5, "banana": 2}

Considerando Questões Estratégicas e de Desempenho

Ao trabalhar com dicionários grandes e realizar operações de classificação, é importante considerar questões estratégicas e de desempenho.

Usando Funções Getter Especiais para Melhorar o Desempenho e a Legibilidade

Ao usar a função sorted() em um dicionário para classificar com base em chaves ou valores, o Python precisa extrair essas informações do dicionário durante o processo de ordenação. Isso pode resultar em um custo computacional adicional.

Uma maneira de melhorar o desempenho e a legibilidade é usar funções getter especiais, como operator.itemgetter(). Essas funções getter são mais eficientes para extrair informações de um dicionário do que as funções lambda usadas anteriormente.

Por exemplo, se você deseja classificar o dicionário data por seus valores em ordem decrescente usando a função operator.itemgetter(), você pode fazer o seguinte:

import operator
data = {"apple": 5, "banana": 2, "cherry": 10}
sorted_data = sorted(data.items(), key=operator.itemgetter(1), reverse=True)
print(sorted_data)

Este código tem o mesmo efeito do exemplo anterior, mas é mais eficiente em termos de desempenho.

Medindo o Desempenho ao Usar itemgetter()

Se você estiver preocupado com o desempenho do seu código ao usar a função operator.itemgetter(), pode usar o módulo timeit para medir o tempo de execução de diferentes abordagens.

Por exemplo, suponha que você queira medir o tempo de execução das duas abordagens anteriores de ordenação do dicionário data. Você pode fazer o seguinte:

import timeit
data = {"apple": 5, "banana": 2, "cherry": 10}
def lambda_approach():
sorted_data = sorted(data.items(), key=lambda x: x[1], reverse=True)
def itemgetter_approach():
import operator
sorted_data = sorted(data.items(), key=operator.itemgetter(1), reverse=True)
lambda_time = timeit.timeit(lambda_approach, number=100000)
itemgetter_time = timeit.timeit(itemgetter_approach, number=100000)
print(f"Lambda Approach Time: {lambda_time}")
print(f"Itemgetter Approach Time: {itemgetter_time}")

Este código medirá os tempos de execução das abordagens lambda e itemgetter para ordenar o dicionário data e imprimirá os resultados.

Considerando se Você Deseja Usar um Dicionário Ordenado

Ao decidir se deseja ou não usar um dicionário ordenado, é importante considerar a frequência com que você precisará classificar o dicionário e se essa funcionalidade justifica o custo computacional adicional.

Geralmente, os dicionários ordenados são mais úteis quando você precisa iterar pelos elementos em uma ordem específica ou obter o elemento com a maior ou menor chave. Se você não precisa desses recursos, pode ser mais eficiente usar um dicionário não ordenado.

Comparando o Desempenho de Diferentes Estruturas de Dados

Além do desempenho da ordenação em um dicionário, também é interessante comparar o desempenho de diferentes estruturas de dados para armazenar seus dados de chave-valor.

Em Python, existem várias estruturas de dados comumente usadas, como listas, dicionários e conjuntos, cada uma com suas próprias vantagens e desvantagens em relação ao desempenho e à funcionalidade.

Por exemplo, se você deseja apenas verificar a existência de uma chave em seus dados de chave-valor, um conjunto pode ser a estrutura de dados mais adequada devido à sua eficiência na operação de pesquisa. Por outro lado, se você precisa de acesso rápido aos valores com base em uma chave, um dicionário pode ser mais adequado.

Ao tomar uma decisão sobre a estrutura de dados a ser usada, leve em consideração as operações que você realizará com mais frequência em seus dados.

Comparando o Desempenho da Ordenação

Além de comparar o desempenho de diferentes estruturas de dados, também pode ser útil comparar o desempenho de diferentes métodos de ordenação.

Em Python, a função sorted() usa o algoritmo de ordenação Timsort, que é considerado muito eficiente na maioria dos casos. No entanto, dependendo das características específicas dos seus dados, pode haver algoritmos de ordenação mais eficientes disponíveis.

Se você estiver lidando com grandes quantidades de dados ou desempenho for crítico para sua aplicação, pode valer a pena investigar diferentes algoritmos de ordenação para encontrar o melhor em seu caso específico.

Comparando o Desempenho das Buscas

Além de comparar o desempenho da ordenação, também é importante considerar o desempenho das operações de busca em suas estruturas de dados.

Em um dicionário, a busca por uma chave é extremamente eficiente, com uma complexidade de tempo médio de O(1). Por outro lado, a busca em uma lista ordenada pode exigir uma pesquisa linear, resultando em uma complexidade de tempo médio de O(n), onde n é o número de elementos na lista.

Ao selecionar a estrutura de dados correta para armazenar seus dados de chave-valor, leve em consideração as operações de busca e considere se a eficiência dessa operação é importante para o seu caso específico.

Conclusão

Neste tutorial, você aprendeu várias maneiras de ordenar um dicionário em Python usando a função sorted(). Você viu como usar as chaves, valores ou ambos do dicionário como base para a ordenação e como especificar uma chave de ordenação personalizada usando funções lambda ou operator.itemgetter().

Você também considerou questões estratégicas e de desempenho ao decidir se deseja ou não usar um dicionário ordenado e ao comparar o desempenho de diferentes estruturas de dados, métodos de ordenação e operações de busca.

Lembre-se de praticar e experimentar com os códigos fornecidos neste tutorial para obter uma compreensão mais completa das técnicas de ordenação de dicionários em Python. Com essa compreensão, você poderá aproveitar ao máximo os dicionários em suas aplicações Python.