回答:
Python 3.6以降、標準dict
タイプはデフォルトで挿入順序を維持します。
定義
d = {'ac':33, 'gw':20, 'ap':102, 'za':321, 'bs':10}
ソースコードにリストされている順序でキーを持つ辞書になります。
これは、スパースハッシュテーブルに整数を含む単純な配列を使用して実現されました。これらの整数は、キーと値のペア(および計算されたハッシュ)を格納する別の配列にインデックスを付けます。後者の配列は、たまたま挿入順に項目を格納するだけであり、組み合わせ全体が実際に使用するメモリは、Python 3.5以前で使用されていた実装よりも少なくなっています。詳細については、レイモンドヘッティンガーによるオリジナルのアイデアの投稿を参照してください。
3.6では、これは実装の詳細と見なされていました。Python 3.6の新機能のドキュメントをご覧ください。
この新しい実装の順序を維持する側面は、実装の詳細と見なされ、信頼すべきではありません(これは将来変更される可能性がありますが、言語仕様を変更する前に、この新しいdict実装をいくつかのリリースで使用することが望まれます)現在および将来のすべてのPython実装に対して順序を維持するセマンティクスを義務付けるために、これは、ランダムな反復順序がまだ有効である古いバージョンの言語(Python 3.5など)との下位互換性を維持するのにも役立ちます。
Python 3.7では、この実装の詳細が言語仕様に引き上げられてdict
いるため、そのバージョン以降と互換性のあるすべてのPython実装で順序を維持することが必須になりました。BDFLによる発音を参照してください。
標準型に加えていくつかの追加機能を提供しているため、特定の場合にはcollections.OrderedDict()
クラスを使用することもできますdict
。そのようなものとしてとして可逆(このまで延びビュー・オブジェクト)、及び(VIAリオーダリング支援move_to_end()
方法)。
dict()
ドキュメントはさえ例が含まれています。
from collections import OrderedDict
OrderedDict((word, True) for word in words)
含む
OrderedDict([('He', True), ('will', True), ('be', True), ('the', True), ('winner', True)])
値がTrue
(またはその他の不変オブジェクト)の場合は、次のものも使用できます。
OrderedDict.fromkeys(words, True)
OrderedDict(FUTURE=[], TODAY=[], PAST=[])
アプローチについて言及した場合、機能しません:OrderedDict([('FUTURE', []), ('TODAY', []), ('PAST', [])])
順序を維持します。
理論的な部分を説明するのではなく、簡単な例を示します。
>>> from collections import OrderedDict
>>> my_dictionary=OrderedDict()
>>> my_dictionary['foo']=3
>>> my_dictionary['aol']=1
>>> my_dictionary
OrderedDict([('foo', 3), ('aol', 1)])
>>> dict(my_dictionary)
{'foo': 3, 'aol': 1}
OrderedDict
確かに問題は解決しますが、この特定の例では、標準の辞書を使用してまったく同じ結果が得られます
{'aol': 1, 'foo': 3}
それは良い説明例だと思います。
OrderedDict.update()
は、キーと値のペアを含むイテラブルで呼び出すことができますd1.upate([(key1, val1), (key2, val2)])
。
この回答はpython3.7より前のバージョンのpythonに適用されることに注意してください。CPython 3.6は、ほとんどの状況で実装の詳細として挿入順序を維持します。Python3.7以降、実装では、挿入順序を維持して準拠させる必要があると宣言されています。
Python辞書は順不同です。順序付けされた辞書が必要な場合は、collections.OrderedDictを試してください。
OrderedDictは、Python 2.7の標準ライブラリに導入されたことに注意してください。古いバージョンのPythonを使用している場合は、順序付き辞書のレシピをActiveStateで見つけることができます。
OrderedDictを機能させる方法を理解しようとしているときに、この投稿に遭遇しました。PyDev for EclipseはOrderedDictをまったく見つけることができなかったので、注文したい辞書のキー値のタプルを作成することにしました。リストを出力する必要があるときは、タプルの値を反復処理し、反復した「キー」をタプルからディクショナリにプラグインして、必要な順序で値を取得しました。
例:
test_dict = dict( val1 = "hi", val2 = "bye", val3 = "huh?", val4 = "what....")
test_tuple = ( 'val1', 'val2', 'val3', 'val4')
for key in test_tuple: print(test_dict[key])
それは少し面倒ですが、私は時間を求められており、それは私が思いついた回避策です。
注:リストの順序付けとインデックス付けが行われているため(また、辞書とは構造が異なるため)、他の誰かが提案したリストリストのアプローチは実際には意味がありません。
あなたは本当に辞書でやりたいことはできません。辞書はすでにd = {'ac':33, 'gw':20, 'ap':102, 'za':321, 'bs':10}
作成されています。既に作成されているため、整理する方法がないことがわかりました。私がしたことは、代わりにオブジェクトでjsonファイルを作成することでした:
{"ac":33,"gw":20,"ap":102,"za":321,"bs":10}
私が使用した:
r = json.load(open('file.json'), object_pairs_hook=OrderedDict)
次に使用:
print json.dumps(r)
検証します。
from collections import OrderedDict
list1 = ['k1', 'k2']
list2 = ['v1', 'v2']
new_ordered_dict = OrderedDict(zip(list1, list2))
print new_ordered_dict
# OrderedDict([('k1', 'v1'), ('k2', 'v2')])
辞書を特定の順序で配置したい場合は、リストのリストを作成することもできます。最初の項目がキー、2番目の項目が値となり、次の例のようになります。
>>> list =[[1,2],[2,3]]
>>> for i in list:
... print i[0]
... print i[1]
1
2
2
3
Djangoプロジェクトの開発時にも同様の問題がありました。古いバージョンのpythonを実行していたため、OrderedDictを使用できなかったため、解決策はDjangoのSortedDictクラスを使用することでした。
https://code.djangoproject.com/wiki/SortedDict
例えば、
from django.utils.datastructures import SortedDict
d2 = SortedDict()
d2['b'] = 1
d2['a'] = 2
d2['c'] = 3
注:この回答は2011年のものです。Pythonバージョン2.7以降にアクセスできる場合は、現在標準collections.OrderedDict
となっているにアクセスできるはずです。その多くの例がこのスレッドの他のユーザーから提供されています。