Qual é a maneira correta de inicializar um dicionário ordenado (OD) para manter a ordem dos dados iniciais?
from collections import OrderedDict
# Obviously wrong because regular dict loses order
d = OrderedDict({'b':2, 'a':1})
# An OD is represented by a list of tuples, so would this work?
d = OrderedDict([('b',2), ('a', 1)])
# What about using a list comprehension, will 'd' preserve the order of 'l'
l = ['b', 'a', 'c', 'aa']
d = OrderedDict([(i,i) for i in l])
Questão:
Uma
OrderedDict
preserva a ordem de uma lista de tuplas, ou tupla de tuplas ou tupla de listas ou lista de listas etc., passada no momento da inicialização (segundo e terceiro exemplo acima)?Como se verifica se
OrderedDict
realmente mantém um pedido? Como adict
possui uma ordem imprevisível, e se meus vetores de teste tiverem, felizmente, a mesma ordem inicial que a ordem imprevisível de um ditado? Por exemplo, se em vez ded = OrderedDict({'b':2, 'a':1})
escreverd = OrderedDict({'a':1, 'b':2})
, posso concluir erroneamente que a ordem está preservada. Nesse caso, descobri que adict
é ordenado alfabeticamente, mas isso nem sempre é verdade. Qual é uma maneira confiável de usar um contraexemplo para verificar se uma estrutura de dados preserva a ordem ou não, exceto por tentar vetores de teste repetidamente até que um deles se quebre?
PS: Vou deixar isso aqui apenas para referência : "O construtor OrderedDict e o método update () aceitam argumentos de palavras-chave, mas sua ordem é perdida porque a função do Python chama argumentos de palavras-passe de semântica de passagem de semântica usando um dicionário regular não ordenado"
PPS: Felizmente, no futuro, o OrderedDict também preservará a ordem dos kwargs (exemplo 1): http://bugs.python.org/issue16991
OrderDict(b=2, a=1)
também é uma maneira adequada. Veja PEP 468 .