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, '=', value

doc = 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?

Foi útil?

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:

  1. PEP 372: Adicionando um dicionário ordenado a coleções
  2. 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 :-)
  3. 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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top