Ordenando dicionários em Python

Publicado por César tinum da silva em 05/02/2009

[ Hits: 23.533 ]

 


Ordenando dicionários em Python



Bom galera, vai uma dica legal sobre Python. Como ordenar dicionários. Quem já tentou ordenar algum dicionário em Python percebeu que ele simplesmente não mantém a ordem com que os dados são inseridos, ou seja, se eu fizer isto:

##DIC 1 E O DICIONÁRIO QUE SERÁ ORDENADO
dic_1 = {'a':1,'b':3,'c':2}
##DICIONÁRIO AUXILIAR
dic_aux = dic_1
##ORDENANDO DIC_1 PELOS VALORES
dic_1 = sorted(dic_1.values())
##PEGA VALORES DO DIC_1 E VAI MONTANDO DIC_RESULTADO A PARTIR DO MENOR VALOR
dic_resultado = {}
for i in dic_1:
   for item in dic_aux:
      if item[i] == i
         dic_resultado[item] = i
print dic_resultado

O dicionário resultado teria ordem aleatória, ou seja, qualquer ordem, menos a que nos queremos (ordem de inserção). Bom, se o Python não tivesse o mal costume não manter a ordem no dicionário, conforme os itens são adicionados, isto resolveria o nosso problema. Mas como ele não mantém a ordem, precisaremos de uma classe auxiliar que faça este trabalho. A classe se chama "ordict.py", está disponível neste link.

Coloque o arquivo no mesmo diretório que o seu arquivo Python e faça a importação da classe desta maneira no começo do seu script:

from odict import *

Pronto, agora seu script enxerga todos os métodos implementados em "odict.py". Agora vamos usá-lo. Basicamente o script de ordenação será o mesmo, com a diferença que o vetor resultado em vez de ser um dicionário será uma instância (objeto) da classe "OrdeneDict", ficando assim o resultado final:

from odict import *
##DIC 1 E O DICIONÁRIO QUE SERA ORDENADO
dic_1 = {'a':1,'b':3,'c':2}
##DICIONARIO AUXILIAR
dic_aux = dic_1
##ORDENANDO DIC_1 PELOS VALORES
dic_1 = sorted(dic_1.values())
##PEGA VALORES DO DIC_1 E VAI MONTANDO DIC_RESULTADO A PARTIR DO MENOR VALOR
dic_resultado = OrderedDict()
for i in dic_1:
   for item in dic_aux:
      if item[i] == i:
         dic_resultado[item] = i
print dic_resultado

Bom, é isso aí por enquanto, espero que seja útil.

Abraço e até a próxima.

Outras dicas deste autor

Python: Somando valores em um dicionário de strings

Criando variáveis dinâmicas em PHP a partir de um formulário

Criando variáveis dinamicamente com Javascript

Leitura recomendada

Programando em Python no VIM com recurso de auto-completar (python-jedi)

Internacionalização dos programas em Python

Lançamento do Stoq versão 0.8.10

Python3 demorando a compilar numpy e/ou pandas [Resolvido]

Livro: Python para desenvolvedores

  

Comentários
[1] Comentário enviado por allisonvoll em 09/02/2009 - 10:42h

Ou então de uma forma mais simples ( e sem uma classe auxiliar ):

sorted(a.items(),lambda x,y: cmp(x[1],y[1]))

onde *a* é o dicionário.

[2] Comentário enviado por mago_dos_chats em 09/02/2009 - 16:41h

sim allisonvoll, so que eu quero como resposta um dicionario ordenado, não uma lista, se fosse pra obter uma lista a 1 implementação usada como exemplo resolveria o caso não acha??
abraço



Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts