1

def createNode(doc_, **param_):
    cache = {'p':'property','l':'label','td':'totalDelay','rd':'routeDelay','ld':'logicDelay'}
    param_ のインデックスの場合:
        newIndex = キャッシュ[インデックス]
        値 = param_[インデックス]
        print newIndex, '=', 値

ドキュメント = 10 createNode(doc, p='path', l='ifft4k_radix4_noUnolling_core.vi', td='3.0', ld='1.0', rd='2.0')

このコードを Python 2.6 で実行すると、次の結果が得られます。

ルート遅延 = 2.0
プロパティ = パス
合計遅延 = 3.0
logicDelay = 1.0
ラベル = ifft4k_radix4_noUnolling_core.vi

パラメータの順序を維持する必要があります。つまり、property最初に来て、最後labelになるまでです。routeDelay

Q : Python で辞書パラメーターの順序を維持する方法は何ですか?

4

3 に答える 3

7

パラメータの順序を維持する必要があります。つまり、プロパティが最初に来て、最後に reouteDelay が得られるまでラベルを付けます。

次に、単に間違った順序で処理を行っているだけです。順序付けされた辞書は必要ありません。代わりに、次のようにcacheのペアのタプルを試してください。

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

これは、バージョンの とまったく同じセマンティクスcreateNodeに加えて、必要な順序を維持するという望ましい特性を備えており、パフォーマンスは少なくとも同等です。「辞書の順序を維持する」ことに焦点を当てることで、間違った問題に焦点を当てることになります (残念ながら、人々が「順序付けられた辞書」に到達するほとんどの場合がそうであるように!-)。

于 2010-02-20T16:13:37.140 に答える
6

通常の辞書では対応できません。代わりに順序付き辞書を使用する必要があります。これらのリンクをチェックしてください:

  1. PEP 372: 順序付けられた辞書をコレクションに追加する
  2. Python でオブジェクト辞書として順序付けられた辞書を使用する- 人々が PEP 372 の odict を使用していることを証明するための SO の質問 :-)
  3. Nicola Larosa & Michael Foord の odict モジュール

もっと詳しく知りたい場合は、「python 順序付け辞書」という検索語を試してください。SOで、ここで順序付けられたdict関連の質問をいくつか見たのを覚えています。したがって、上記のリンクが何らかの理由で不十分な場合は、おそらく他の質問でより良いものを見つけることができます。

更新: タプルのリストを使用するというマークの提案は、実際には完全に優れている可能性がありますが、名前付きタプルの方が便利な場合があります: docs の関連フラグメントまた、データのシリアライゼーション/デシリアライゼーションを計画していて、それを非常に高速に実行したい場合は、Google のプロトコル バッファ(利用可能な Python ツール) を確認してください。

于 2010-02-20T15:40:39.283 に答える
3

辞書はキーの順序を保持しません。辞書の代わりにタプルのリストを使用できます。

于 2010-02-20T15:35:23.177 に答える