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 ).