0

私が知っていることに基づいて、データ構造(辞書など)が初期化した順序と同じ順序で値を保存するとは想定できません。例えば:

d = {1:10,2:20,3:30}

for ループ内で出力すると、結果は次のようになります。

{2:20,1:10,3:30}

なぜそれが起こるのか - ディクショナリ (または他のデータ構造) が特定の順序で値を保持しないのはなぜですか? それは辞書だけに当てはまりますか?

4

4 に答える 4

1

dictPythonのsとsはどちらもset順序を失います。これは、ハッシュテーブルとして実装されているため、順序の保持よりもルックアップ時間が短縮されるためです。

順序保存を対象としたデータ構造を探している場合は、listsを確認する必要があります。あなたの場合、タプルのリストを次のように使用できます。

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)])

お役に立てれば

于 2012-11-22T02:05:56.730 に答える
1

Python の組み込み型の中で、辞書とセットに当てはまります。リストとタプルは順序を保持します。collections.OrderedDict辞書の順序付きバージョンがあります。他の型 (たとえば、Python に組み込まれていないライブラリからの型) については、ドキュメントを読むだけで済みます。Python で「データ構造」が何をするかについての一般的なルールはありません。どのような動作が定義されているか、または定義されていないかを理解するには、各タイプのドキュメントを参照する必要があります。

Python は「シーケンス」の概念を定義しています。これは順序を持つように定義されています (リストとタプルはシーケンスです)。辞書は「マッピング」であり、順序は必要ありません。(詳細については、Python 用語集コレクション モジュールを参照してください。)

理由については、辞書がどのように実装されたかにすぎません。基本的に、順序を追跡する必要がなければ高速になる可能性があり、多くの場合、順序を気にしないため、効率のために順序なしコレクションとして実装されました。

于 2012-11-22T02:02:16.507 に答える
0

はい、それは辞書だけです。その下にあるディクショナリは、実際には値をそのままではなく、値とペアになっているキーのハッシュとして格納します。これにより、非常に高速なルックアップが可能になります。リストとタプルは順序を維持します。

于 2012-11-22T02:04:07.423 に答える
0

辞書は、キーの検索を効率的にするためにエントリを並べ替えます。キーを追加された順序と同じ順序に保ちたい場合は、を試してくださいOrderedDict

于 2012-11-22T02:04:32.663 に答える