dict を OrderedDict に変換する 質問する

dict を OrderedDict に変換する 質問する

クラスの使用に問題があります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')])

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

どこでエラーが発生しているのでしょうか? これは Linux バージョンにすぎないため、Python の pi バージョンとは関係ないはずです。

ベストアンサー1

辞書を作成しています初め、その辞書を に渡します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()詳細については、 を参照してください。また、特定のケースでは を使用する必要がある理由についても説明します。

おすすめ記事