クラスの使用に問題があります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()
詳細については、 を参照してください。また、特定のケースでは を使用する必要がある理由についても説明します。