Estou tendo problemas para usar a collections.OrderedDict
classe. Estou usando o Python 2.7 no Raspbian, a distribuição Debian para o Raspberry Pi. Estou tentando imprimir dois dicionários para comparação (lado a lado) de uma aventura de texto. A ordem é essencial para comparar com precisão. Não importa o que eu tente, os dicionários imprimem da maneira habitual e não ordenada.
Aqui está o que recebo quando faço no meu RPi:
import collections
ship = {"NAME": "Albatross",
"HP":50,
"BLASTERS":13,
"THRUSTERS":18,
"PRICE":250}
ship = collections.OrderedDict(ship)
print ship
# OrderedDict([('PRICE', 250), ('HP', 50), ('NAME', 'Albatross'), ('BLASTERS', 13), ('THRUSTERS', 18)])
Obviamente, há algo errado, porque está imprimindo a chamada de função e colocando as chaves e os grupos de valores em uma lista aninhada ...
Isto é o que eu consegui executando algo semelhante no meu PC:
import collections
Joe = {"Age": 28, "Race": "Latino", "Job": "Nurse"}
Bob = {"Age": 25, "Race": "White", "Job": "Mechanic", "Random": "stuff"}
#Just for clarity:
Joe = collections.OrderedDict(Joe)
Bob = collections.OrderedDict(Bob)
print Joe
# OrderedDict([('Age', 28), ('Race', 'Latino'), ('Job', 'Nurse')])
print Bob
# OrderedDict([('Age', 25), ('Race', 'White'), ('Job', 'Mechanic'), ('Random', 'stuff')])
Desta vez, está em ordem, mas não deveria imprimir as outras coisas, certo? (Colocando na lista e mostrando a chamada de função.)
Onde estou cometendo meu erro? Não deve ter nada a ver com a versão pi do Python, porque é apenas a versão Linux.
fonte
OrderedDict
é classificado por ordem de inserção, não por ordem alfanumérica.Respostas:
Você está criando um dicionário primeiro e depois passando esse dicionário para um
OrderedDict
. Para versões do Python <3.6 (*) , quando você fizer isso, a ordem não estará mais correta.dict
é inerentemente não ordenado.Passe uma sequência de tuplas:
O que você vê quando imprime
OrderedDict
é sua representação , e está totalmente correto.OrderedDict([('PRICE', 250), ('HP', 50), ('NAME', 'Albatross'), ('BLASTERS', 13), ('THRUSTERS', 18)])
mostra apenas, em uma representação reproduzível , quais são os conteúdos do arquivoOrderedDict
.(*) : Na implementação do CPython 3.6, o
dict
tipo foi atualizado para usar uma estrutura interna mais eficiente em termos de memória que tem o efeito colateral feliz de preservar a ordem de inserção e, por extensão, o código mostrado na pergunta funciona sem problemas. A partir do Python 3.7, a especificação da linguagem Python foi atualizada para exigir que todas as implementações do Python sigam esse comportamento. Veja esta outra resposta minha para obter detalhes e também por que você ainda pode querer usar umOrderedDict()
para determinados casos.fonte
print ship
?? Obrigado :)OrderedDict
é criado que é um dicionário.Se você não pode editar esta parte do código onde seu dict foi definido, você ainda pode solicitá-lo a qualquer momento e da forma que desejar, como este:
fonte
Na maioria das vezes, procuramos o OrderedDict quando solicitamos um pedido personalizado, não genérico como o ASC etc.
Aqui está a solução proposta:
Isso será gerado:
Nota : Os novos dicionários classificados mantêm sua ordem de classificação quando as entradas são excluídas. Porém, quando novas chaves são adicionadas, elas são anexadas ao final e a classificação não é mantida. ( Documento oficial )
fonte
Use dict.items (); pode ser tão simples como a seguir:
fonte