Qual é a maneira de manter a ordem dos parâmetros do dicionário em Python?
-
21-09-2019 - |
Pergunta
def createNode(doc_, **param_): cache = {'p':'property','l':'label','td':'totalDelay','rd':'routeDelay','ld':'logicDelay'} for index in param_: newIndex = cache[index] value = param_[index] print newIndex, '=', valuedoc = 10 createNode (doc, p = 'caminho', l = 'ifft4k_radix4_nounolling_core.vi', td = '3.0', ld = '1.0', rd = '2.0')
A execução deste código no Python 2.6 me dá o seguinte resultado.
routeDelay = 2.0 property = path totalDelay = 3.0 logicDelay = 1.0 label = ifft4k_radix4_noUnolling_core.vi
Eu preciso manter a ordem dos parâmetros, quero dizer, property
Vem primeiro, então label
até eu conseguir routeDelay
último.
P: Qual é a maneira de manter a ordem do parâmetro do dicionário em Python?
Solução
Eu preciso manter a ordem do parâmetro, quero dizer, a propriedade vem primeiro e depois rotular até que eu seja reagente por último.
Então você está simplesmente fazendo as coisas na ordem errada - sem necessidade de dicionários ordenados! Tente, em vez disso, uma tupla de pares para cache, do seguinte modo:
def createNode(doc_, **param_):
cache = ( ('p', 'property'), , ('l', 'label'), ('td', 'totalDelay'),
('rd', 'routeDelay'), ('ld', 'logicDelay') )
for index, newIndex in cache:
if index not in param_:
continue
value = param_[index]
print newIndex, '=', value
Isso tem exatamente a mesma semântica que sua versão de createNode
, além da propriedade desejada de manter o pedido que você deseja, e o desempenho é pelo menos tão bom. Ao focar em "manter o dicionário ordenado", você está se concentrando no problema errado (como é o caso, infelizmente, para a maioria casos em que as pessoas buscam "dicionários ordenados"!-).
Outras dicas
Um dicionário regular não serve, você terá que usar um dicionário ordenado. Confira estes links:
- PEP 372: Adicionando um dicionário ordenado a coleções
- Usando um ditado ordenado como dicionário de objeto em Python -Uma pergunta para provar que as pessoas estão usando o odito do PEP 372 :-)
- Nicola Larosa e Michael Foord Módulo de Odict
Experimente o termo de pesquisa "Python ordenado dicionário" se você quiser pesquisar no Google para obter mais. Lembro -me de ver várias questões relacionadas ao dicto ordenadas aqui, então, por isso, se os links acima forem inadequados por algum motivo, talvez você possa encontrar algo melhor em alguma outra pergunta.
ATUALIZAÇÃO: A sugestão de Mark para usar uma lista de tuplas pode ser perfeitamente boa, na verdade, mas as tuplas denominadas podem ser mais convenientes: um fragmento relevante nos documentos. Além disso, se você está planejando fazer alguma serialização / desestimação em seus dados e gostaria de fazer isso muito depressa, confira o Google's Buffers de protocolo (Ferramentas Python disponíveis).
Os dicionários não preservam a ordem das chaves. Você pode usar uma lista de tuplas em vez de um dicionário.