10 de março de 2013

Dicionários na sequência de criação

Os dicionários em Python são estruturas muito poderosas e rápidas. Mas uma característica ruim deles é que a ordem das chaves não é garantida. Isso significa que ao criar um dicionário você pode ver algo assim:
>>> d = {'ac': 'Acre', 'ce': 'Ceará', 'pi': 'Piauí'}
>>> print(d)
{'ac': 'Acre', 'pi': 'Piauí', 'ce': 'Ceará'}
>>> 
Viu? Fora de ordem.

Isso atrapalha quando queremos manter a ordem dos itens, como, por exemplo, ao alimentar um HTML SELECT a partir de um dicionário. Se você usa Django, provavelmente já precisou fazer isso em um choices. Nesse caso, o normal é criarmos uma lista de tuplas e iterar nos itens, o que não é lá muito intuitivo.

Era. A partir do Python 2.7, você pode usar um OrderedDict (que está no módulo collections) e resolver este problema:
>>> from collections import OrderedDict
>>> d = OrderedDict([('ac', 'Acre'), ('ce', 'Ceará'), ('pi', 'Piauí')])
>>> print(d)
OrderedDict([('ac', 'Acre'), ('ce', 'Ceará'), ('pi', 'Piauí')])
>>> 

Agora sim, com a ordem mantida.

Se você observar direitinho, informamos uma lista de tuplas, como eu disse que seria uma alternativa de solução. Então, qual a vantagem do OrderedDict?

Algumas facilidades:
>>> d['ac'] = 'Novo Acre'
>>> print(d)
OrderedDict([('ac', 'Novo Acre'), ('ce', 'Ceará'), ('pi', 'Piauí')])
>>>
>>> d['go'] = 'Goiás'
>>> print(d)
OrderedDict([('ac', 'Novo Acre'), ('ce', 'Ceará'), ('pi', 'Piauí'), ('go', 'Goiás')])
>>>
>>> del d['ce']
>>> print(d)
OrderedDict([('ac', 'Novo Acre'), ('pi', 'Piauí'), ('go', 'Goiás')])
>>> 


No exemplo acima, foi possível indexarmos pela chave e modificar o conteúdo sem mudar a ordem das chaves. Também incluímos um item ao final do dicionário com facilidade, apenas com uma atribuição normal de dicionário. Outra coisa simples de fazer é excluir um item, bastando indexarmos pela chave do dicionário. Ou seja, é um dicionário.

Assim, o uso dos OrderedDict deixa o código mais intuitivo, já que a sintaxe de dicionários, e com a garantia de manter a sequência das chaves.

Eu sou Vinicius Assef, um programador do século passado que gosta de Python, pratica Lean Development e acredita em Deus. Você pode me contactar por email ou twitter.

Nenhum comentário:

Postar um comentário

Marcadores