順序付き辞書(OD)を初期化して、初期データの順序を保持する正しい方法は何ですか?
from collections import OrderedDict
# Obviously wrong because regular dict loses order
d = OrderedDict({'b':2, 'a':1})
# An OD is represented by a list of tuples, so would this work?
d = OrderedDict([('b',2), ('a', 1)])
# What about using a list comprehension, will 'd' preserve the order of 'l'
l = ['b', 'a', 'c', 'aa']
d = OrderedDict([(i,i) for i in l])
質問:
OrderedDict
は、初期化時に渡されたタプルのリスト、タプルのタプル、リストのタプルまたはリストのリストなどの順序を保持しますか(上記の2番目と3番目の例)?
OrderedDict
が実際に順序を維持しているかどうかを確認するにはどうすればよいですか? dict
の順序は予測不能であるため、幸いなことに、テストベクトルの初期順序が予測不可能なdictの順序と同じ場合はどうなりますか?たとえば、d = OrderedDict({'b':2, 'a':1})
の代わりにd = OrderedDict({'a':1, 'b':2})
と書くと、順序が保持されていると間違って結論付けることができます。この場合、dict
がアルファベット順に並べられていることがわかりましたが、必ずしもそうとは限りません。反例を使用して、データ構造が順序を保持しているかどうかを検証するための信頼できる方法は何ですか?
追伸 reference :のためにここに置いておきます。辞書"
P.P.S:将来的には、OrderedDictがkwargsの順序も保持することを願っています(例1): http://bugs.python.org/issue16991
OrderedDictは、アクセス可能なすべての注文を保持します。順序付けられたデータを渡して初期化する唯一の方法は、最後の2つの例のように、キーと値のペアのリスト(より一般的には反復可能)を渡すことです。リンクしたドキュメントにあるように、キーワード引数またはdict引数を渡すと、OrderedDictコンストラクターが見る前に順序が削除されるため、OrderedDictは順序にアクセスできません。
最後の例でリスト内包表記を使用しても何も変わらないことに注意してください。 OrderedDict([(i,i) for i in l])
とOrderedDict([('b', 'b'), ('a', 'a'), ('c', 'c'), ('aa', 'aa')])
に違いはありません。リストの内包表記が評価され、リストが作成されて渡されます。 OrderedDictは、作成方法について何も知りません。
# An OD is represented by a list of tuples, so would this work?
d = OrderedDict([('b', 2), ('a', 1)])
はい、動作します。定義により、リストは常にそれが表現される方法で順序付けられます。これはリストの理解にも当てはまります。生成されるリストは、データが提供されたのと同じ方法です(つまり、リストからのソースは確定的であり、set
またはdict
はそれほど多くありません)。
OrderedDict
が実際に順序を維持しているかどうかを確認する方法を教えてください。 dictには予測不可能な順序があるため、幸いなことに、テストベクトルがdictの予測不可能な順序と同じ初期順序を持っている場合はどうなりますか?たとえば、d = OrderedDict({'b':2, 'a':1})
の代わりにd = OrderedDict({'a':1, 'b':2})
と書くと、順序が保持されていると間違って結論付けることができます。この場合、dict
がアルファベット順になっていることがわかりましたが、常に正しいとは限りません。つまり、データ構造が順序を保持しているかどうか、または中断するまでテストベクトルを繰り返し試行するかどうかを確認するために、反例を使用する信頼できる方法は何ですか?.
参照用に2タプルのソースリストを保持し、単体テストを行う際にテストケースのテストデータとして使用します。それらを繰り返し、順序が維持されるようにします。