1. ホーム
  2. python

[解決済み] dictからOrderedDictへの変換

2022-06-01 10:29:35

質問

を使うのに少し問題があります。 collections.OrderedDict クラスの使用に問題があります。私はRaspbian(Raspberry Pi用のDebianディストロ)上で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')])

今回は順番に表示されていますが、他のものは表示されないはずですよね?(リストに入れたり、関数呼び出しを表示したり)

どこでエラーになっているのでしょうか?pi版のPythonはLinux版だけなので、関係ないはずです。

どうすれば解決するのですか?

辞書を作成する 最初 を作成し、その辞書を 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() を使いたい理由も説明しています。