150

collections.OrderedDictクラスの使用に問題があります。Raspberry Pi の Debian ディストリビューションである Raspbian で Python 2.7 を使用しています。テキストアドベンチャーの比較(並べて)のために、2つの辞書を印刷しようとしています。正確に比較するには順序が重要です。私が何をしようとしても、辞書は通常の順不同で印刷されます。

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)])

関数呼び出しを出力し、キーと値のグループをネストされたリストに入れているため、明らかに何かが正しくありません...

これは、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')])

今回は順調ですが、他のものを印刷しているはずがありませんよね?(リストに入れ、関数呼び出しを表示します。)

どこでエラーを起こしていますか? Python の pi バージョンとは関係ありません。これは単なる Linux バージョンであるためです。

4

5 に答える 5

231

最初に辞書を作成し、次にその辞書をOrderedDict. Python バージョン < 3.6 (*)の場合、それを行うまでに、順序が正しくなくなります。dictは本質的に順序付けされていません。

代わりに一連のタプルを渡します。

ship = [("NAME", "Albatross"),
        ("HP", 50),
        ("BLASTERS", 13),
        ("THRUSTERS", 18),
        ("PRICE", 250)]
ship = collections.OrderedDict(ship)

を印刷するOrderedDictと表示されるのは、その表現であり、完全に正しいものです。の内容が何であるかを再現可能OrderedDict([('PRICE', 250), ('HP', 50), ('NAME', 'Albatross'), ('BLASTERS', 13), ('THRUSTERS', 18)])な表現で示しているだけです。OrderedDict


(*) : CPython 3.6 の実装では、dictタイプが更新され、挿入順序を保持するという嬉しい副作用を持つ、よりメモリ効率の高い内部構造を使用するようになりました。拡張により、質問に示されているコードは問題なく動作します。Python 3.7 の時点で、Python 言語仕様が更新され、すべての Python 実装がこの動作に従う必要があるようになりました。詳細と、特定のケースでまだ使用したい理由については、私の他の回答を参照してください。OrderedDict()

于 2013-03-29T21:40:59.733 に答える