web-dev-qa-db-ja.com

Python OrderedDictは要素の順序を維持しません

OrderedDictオブジェクトを作成しようとしていますが、すぐに作成します。要素がすべてごちゃごちゃになっています。

これが私がすることです:

from collections import OrderedDict
od = OrderedDict({(0,0):[2],(0,1):[1,9],(0,2):[1,5,9]})

要素は、割り当てた順序にとどまりません

od
OrderedDict([((0, 1), [1, 9]), ((0, 0), [2]), ((0, 2), [1, 5, 9])])

docs.python.orgには例がなく、なぜ注文が混乱しているのかわかりません。どんな助けも大歓迎です。

49
Ecolitan

あなたの問題は、dictに初期データを与えるOrderedDictを構築していることです-このdictdoes n't注文を保存するため、OrderedDictに到達する前に注文は失われます。

解決策は、順序付けられたデータ型から構築することです-最も簡単なのは、listsのTupleです:

>>> from collections import OrderedDict
>>> od = OrderedDict([((0, 0), [2]), ((0, 1), [1, 9]), ((0, 2), [1, 5, 9])])
>>> od
OrderedDict([((0, 0), [2]), ((0, 1), [1, 9]), ((0, 2), [1, 5, 9])])

これがOrderedDictが文字列表現に使用する構文を使用する理由であることに注意する価値があります-文字列表現は有効なPythonコードを使用してオブジェクトを再現する必要があります。出力が辞書ではなくタプルのリストを使用する理由。

編集: Python 3.6、kwargsが順序付けられている なので、最新の状態であれば、代わりにキーワード引数を使用できますPythonバージョン。

.7以降 、これはdictsにも当てはまります(3.6のCPythonに当てはまりましたが、言語仕様では指定されていなかったため、OrderedDictの使用は依然として互換性のために必要)。これは、3.7 +環境を想定できる場合、OrderedDictを完全に削除するか、特定の機能が必要な場合は通常のdictから構築できることを意味します(例:平等を重視するための順序) 。

91
Gareth Latty