私が知っていることに基づいて、データ構造(辞書など)が初期化した順序と同じ順序で値を保存するとは想定できません。例えば:
d = {1:10,2:20,3:30}
for ループ内で出力すると、結果は次のようになります。
{2:20,1:10,3:30}
なぜそれが起こるのか - ディクショナリ (または他のデータ構造) が特定の順序で値を保持しないのはなぜですか? それは辞書だけに当てはまりますか?
私が知っていることに基づいて、データ構造(辞書など)が初期化した順序と同じ順序で値を保存するとは想定できません。例えば:
d = {1:10,2:20,3:30}
for ループ内で出力すると、結果は次のようになります。
{2:20,1:10,3:30}
なぜそれが起こるのか - ディクショナリ (または他のデータ構造) が特定の順序で値を保持しないのはなぜですか? それは辞書だけに当てはまりますか?
dict
Pythonのsとsはどちらもset
順序を失います。これは、ハッシュテーブルとして実装されているため、順序の保持よりもルックアップ時間が短縮されるためです。
順序保存を対象としたデータ構造を探している場合は、list
sを確認する必要があります。あなたの場合、タプルのリストを次のように使用できます。
In [255]: L = []
In [256]: L.append((1,10))
In [257]: L.append((2,20))
In [258]: L.append((3,30))
In [259]: L
Out[259]: [(1, 10), (2, 20), (3, 30)]
ただし、順序を維持し、提供するものよりも高速なルックアップ時間を必要とする場合は、 :list
を使用する方がよいでしょう。OrderedDict
In [265]: d = collections.OrderedDict()
In [266]: d[1]=10
In [267]: d
Out[267]: OrderedDict([(1, 10)])
In [268]: d[2]=20
In [269]: d
Out[269]: OrderedDict([(1, 10), (2, 20)])
In [270]: d[3]=30
In [271]: d
Out[271]: OrderedDict([(1, 10), (2, 20), (3, 30)])
お役に立てれば
Python の組み込み型の中で、辞書とセットに当てはまります。リストとタプルは順序を保持します。collections.OrderedDict
辞書の順序付きバージョンがあります。他の型 (たとえば、Python に組み込まれていないライブラリからの型) については、ドキュメントを読むだけで済みます。Python で「データ構造」が何をするかについての一般的なルールはありません。どのような動作が定義されているか、または定義されていないかを理解するには、各タイプのドキュメントを参照する必要があります。
Python は「シーケンス」の概念を定義しています。これは順序を持つように定義されています (リストとタプルはシーケンスです)。辞書は「マッピング」であり、順序は必要ありません。(詳細については、Python 用語集とコレクション モジュールを参照してください。)
理由については、辞書がどのように実装されたかにすぎません。基本的に、順序を追跡する必要がなければ高速になる可能性があり、多くの場合、順序を気にしないため、効率のために順序なしコレクションとして実装されました。
はい、それは辞書だけです。その下にあるディクショナリは、実際には値をそのままではなく、値とペアになっているキーのハッシュとして格納します。これにより、非常に高速なルックアップが可能になります。リストとタプルは順序を維持します。
辞書は、キーの検索を効率的にするためにエントリを並べ替えます。キーを追加された順序と同じ順序に保ちたい場合は、を試してくださいOrderedDict
。