A partir do Python 3.6, o ditado interno será ordenado
Boas notícias, portanto, o caso de uso original do OP de pares de mapeamento recuperados de um banco de dados com IDs de string exclusivos como chaves e valores numéricos como valores em um dict interno do Python v3.6 + deve agora respeitar a ordem de inserção.
Se digamos as expressões de tabela de duas colunas resultantes de uma consulta ao banco de dados como:
SELECT a_key, a_value FROM a_table ORDER BY a_value;
seria armazenado em duas tuplas Python, k_seq e v_seq (alinhadas pelo índice numérico e com a mesma duração, é claro), então:
k_seq = ('foo', 'bar', 'baz')
v_seq = (0, 1, 42)
ordered_map = dict(zip(k_seq, v_seq))
Permitir a saída mais tarde como:
for k, v in ordered_map.items():
print(k, v)
neste caso (para o novo ditado interno do Python 3.6+!):
foo 0
bar 1
baz 42
na mesma ordem por valor de v.
Onde na instalação do Python 3.5 na minha máquina, atualmente ela produz:
bar 1
foo 0
baz 42
Detalhes:
Conforme proposto em 2012 por Raymond Hettinger (cf. mail no python-dev com o assunto "Dicionários mais compactos com iteração mais rápida" ) e agora (em 2016) anunciado em um email de Victor Stinner para python-dev com o assunto "dict Python 3.6 torna-se compactar e obter uma versão privada, e as palavras-chave serão ordenadas " devido à correção / implementação da edição 27350 " Dict compacto e ordenado " no Python 3.6, agora poderemos usar um dict interno para manter a ordem de inserção !!
Esperamos que isso leve a uma implementação de OrderedDict de camada fina como um primeiro passo. Como @ JimFasarakis-Hilliard indicou, alguns veem casos de uso para o tipo OrderedDict também no futuro. Acho que a comunidade Python em geral inspecionará cuidadosamente, se isso resistirá ao teste do tempo e quais serão os próximos passos.
Hora de repensar nossos hábitos de codificação para não perder as possibilidades abertas pela ordenação estável de:
- Argumentos de palavras-chave e
- armazenamento intermediário (dict)
O primeiro porque facilita o envio na implementação de funções e métodos em alguns casos.
A segunda, como incentiva a usar mais facilmente dict
s como armazenamento intermediário nos pipelines de processamento.
Raymond Hettinger gentilmente forneceu a documentação que explica " Os dicionários Tech Behind Python 3.6 " - a partir de sua apresentação em San Francisco Python Meetup Group 2016-DEC-08.
E talvez algumas páginas de perguntas e respostas com alto nível de Stack Overflow recebam variantes dessas informações e muitas respostas de alta qualidade também exigirão uma atualização por versão.
Advertência Emptor (mas também veja abaixo a atualização 2017-12-15):
Como o @ajcr observa, com razão: "O aspecto de preservação de pedidos dessa nova implementação é considerado um detalhe da implementação e não deve ser considerado". (a partir do whatsnew36 ), não a escolha, mas a citação foi cortada um pouco pessimista ;-). Ele continua como "(isso pode mudar no futuro, mas é desejável ter essa nova implementação de ditado no idioma para alguns lançamentos antes de alterar a especificação do idioma para determinar a semântica de preservação de ordem 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). "
Assim como em algumas línguas humanas (por exemplo, alemão), o uso molda a língua, e a vontade agora foi declarada ... no que é novo36 .
Atualização 15-12-2017:
Em um email para a lista python-dev , Guido van Rossum declarou:
Faça assim. "Dict mantém ordem de inserção" é a decisão. Obrigado!
Portanto, o efeito colateral do CPython da versão 3.6 do pedido de inserção de dict agora está se tornando parte da especificação da linguagem (e não mais apenas um detalhe da implementação). Esse segmento de correio também apareceu em alguns objetivos de design distintos, collections.OrderedDict
conforme lembrado por Raymond Hettinger durante a discussão.