A partir do Python 3.6 em diante, o dict
tipo padrão mantém a ordem de inserção por padrão.
Definindo
d = {'ac':33, 'gw':20, 'ap':102, 'za':321, 'bs':10}
resultará em um dicionário com as chaves na ordem listada no código-fonte.
Isso foi alcançado usando uma matriz simples com números inteiros para a tabela de hash esparsa, onde esses números inteiros indexam em outra matriz que armazena os pares de valores-chave (mais o hash calculado). Esse último array apenas armazena os itens em ordem de inserção e toda a combinação realmente usa menos memória do que a implementação usada no Python 3.5 e anteriores. Veja o post de idéias original de Raymond Hettinger para obter detalhes.
Na versão 3.6, isso ainda era considerado um detalhe de implementação; ver o que há de novo em Python 3.6 documentação :
O aspecto de preservação de pedidos dessa nova implementação é considerado um detalhe da implementação e não deve ser considerado (isso pode mudar no futuro, mas é desejável que essa nova implementação de ditado no idioma seja liberada algumas vezes antes de alterar as especificações do idioma. para exigir a semântica de preservação de pedidos para todas as implementações atuais e futuras do Python, isso também ajuda a preservar a compatibilidade com versões anteriores da linguagem em que a ordem de iteração aleatória ainda está em vigor, por exemplo, Python 3.5).
O Python 3.7 eleva esses detalhes de implementação a uma especificação de linguagem ; portanto, agora é obrigatório dict
preservar a ordem em todas as implementações do Python compatíveis com essa versão ou mais recente. Veja o pronunciamento do BDFL .
Você ainda pode usar a collections.OrderedDict()
classe em alguns casos, pois ela oferece algumas funcionalidades adicionais sobre o dict
tipo padrão . Como reversível (isso se estende aos objetos da visualização ) e suporte à reordenação (por meio do move_to_end()
método ).
dict()
documentação ainda inclui um exemplo.contém
Se os valores forem
True
(ou qualquer outro objeto imutável), você também poderá usar:fonte
OrderedDict(FUTURE=[], TODAY=[], PAST=[])
não funcionam, quando mencionadas:OrderedDict([('FUTURE', []), ('TODAY', []), ('PAST', [])])
manterão a ordem.Em vez de explicar a parte teórica, darei um exemplo simples.
fonte
OrderedDict
de fato resolve o problema, mas ... neste exemplo em particular que você obtenha exatamente o mesmo resultado usando um dicionário padrão{'aol': 1, 'foo': 3}
Então, acho que é um bom exemplo ilustrativo.OrderedDict.update()
com um iterável contendo pares chave-valor:d1.upate([(key1, val1), (key2, val2)])
.Observe que esta resposta se aplica às versões python anteriores ao python3.7. O CPython 3.6 mantém a ordem de inserção na maioria das circunstâncias como um detalhe de implementação. A partir do Python3.7 em diante, foi declarado que as implementações DEVEM manter a ordem de inserção para serem compatíveis.
dicionários python não são ordenados. Se você deseja um dicionário ordenado, tente collections.OrderedDict .
Observe que o OrderedDict foi introduzido na biblioteca padrão no python 2.7. Se você possui uma versão mais antiga do python, pode encontrar receitas para dicionários ordenados no ActiveState .
fonte
Os dicionários usarão um pedido que tornará a pesquisa eficiente e você não poderá alterá-lo,
Você pode simplesmente usar uma lista de objetos (uma tupla de 2 elementos em um caso simples ou mesmo uma classe) e anexar itens ao final. Você pode usar a pesquisa linear para encontrar itens nela.
Como alternativa, você pode criar ou usar uma estrutura de dados diferente criada com a intenção de manter a ordem.
fonte
Me deparei com este post enquanto tentava descobrir como fazer o OrderedDict funcionar. O PyDev para Eclipse não conseguiu encontrar o OrderedDict, então acabei decidindo fazer uma tupla dos valores-chave do meu dicionário, como gostaria que eles fossem ordenados. Quando eu precisava exibir minha lista, apenas iterava os valores da tupla e conectei a 'chave' iterada da tupla no dicionário para recuperar meus valores na ordem em que eu precisava deles.
exemplo:
É um pouco complicado, mas estou com pressa de tempo e é a solução alternativa que inventei.
nota: a lista de listas que alguém sugeriu não faz muito sentido para mim, porque as listas são ordenadas e indexadas (e também são uma estrutura diferente dos dicionários).
fonte
Você não pode realmente fazer o que quiser com um dicionário. Você já tem o dicionário
d = {'ac':33, 'gw':20, 'ap':102, 'za':321, 'bs':10}
criado. Descobri que não havia como manter a ordem, uma vez que ela já foi criada. O que eu fiz foi criar um arquivo json com o objeto:Eu usei:
então usado:
verificar.
fonte
fonte
Outra alternativa é usar o Pandas,
dataframe
pois ele garante a ordem e a localização do índice dos itens em uma estrutura semelhante a um ditado.fonte
Geralmente, você pode criar uma classe que se comporta como um dicionário, seja principalmente da implementação dos métodos
__contains__
,__getitem__
,__delitem__
,__setitem__
e alguns mais. Essa classe pode ter qualquer comportamento que você desejar, por exemplo, privando um iterador classificado sobre as chaves ...fonte
se você deseja ter um dicionário em uma ordem específica, também pode criar uma lista de listas, onde o primeiro item será a chave e o segundo item será o valor e será semelhante a este exemplo
fonte
Eu tive um problema semelhante ao desenvolver um projeto Django. Não pude usar o OrderedDict, porque estava executando uma versão antiga do python, então a solução foi usar a classe SortedDict do Django:
https://code.djangoproject.com/wiki/SortedDict
por exemplo,
Nota: Esta resposta é originalmente de 2011. Se você tiver acesso ao Python versão 2.7 ou superior, deverá ter acesso ao padrão agora
collections.OrderedDict
, dos quais muitos exemplos foram fornecidos por outras pessoas neste segmento.fonte
Você pode fazer a mesma coisa que fiz no dicionário.
Crie uma lista e um dicionário vazio:
fonte