9

重複の可能性:
Pythonが私の辞書をそのように注文するのはなぜですか?

以下から得られる出力と少し混乱しています。実行されるループの順序がわかりません。

domains = { "de": "Germany", "sk": "Slovakia", "hu": "Hungary",
    "us": "United States", "no": "Norway"  }

for key in domains:
    print key

ここでの出力は

sk
de
no
us
hu

だがしかし

de
sk
hu
us
no

同様に、ここ

num = {1:"one",4:"two",23:"three",10:"four"}
for key in num:
    print key
output is
1
10
4
23

だがしかし

1
4
23
10

助けてくれてありがとう

4

5 に答える 5

8

Python辞書は順序を保持しません

キーと値は、ランダムではなく、Pythonの実装によって異なり、辞書の挿入と削除の履歴に依存する任意の順序で一覧表示されます。

CPythonのディクショナリは、高速ルックアップとメンバーシップテストを可能にするハッシュテーブルとして実装され、キーまたは値の列挙は、アイテムがそのテーブルにリストされている順序で行われます。それらが挿入される場所は、キーのハッシュ値と、以前に同じスロットにハッシュされたものがあるかどうかによって異なります。

表示するたびにキーを並べ替えるか、順序を維持するために別のタイプのデータ構造を使用する必要があります。Python 2.7以降にはcollections.OrderedDict()型があります。または、2つの値のタプルのリストを使用できます(この時点で、個々のキーと値のペアのルックアップは遅くなります)。

于 2013-01-21T19:19:53.087 に答える
7

Python辞書には順序がありません。ただし、sorted(domains)関数を使用して順序を指定できます。デフォルトでは、キーを使用してソートします。

for key in sorted(domains):
    print key

を生成します

de
hu
no
sk
us

値に基づいて注文する場合は、のようなものを使用できますsorted(domains.items(), key = lambda(k, v): (v, k))

于 2013-01-21T19:20:57.707 に答える
6

順序は指定されていません。ただし、辞書に変更がない限り、変更されないことが保証されます。

反復するときにキーを並べ替えることができます。

for key in sorted(domains):
    print key

最後に、Pythonの新しいバージョンには、挿入順序collections.OrderedDictを保持するが含まれていることに注意してください。

于 2013-01-21T19:20:30.593 に答える
2

Pythonで順序付けられた辞書が必要な場合は、次を使用する必要がありますcollections.OrderedDict

于 2013-01-21T19:22:02.200 に答える
2

定義上、辞書には順序がありません。それはそれを危険な「未定義動作」ゾーンに置きます-それは実装/インスタンス間で突然すべてを変える可能性があるので、あなたがプログラムするものでそれを信頼するのは良い考えではありません。たとえそれが今あなたが望むようにうまくいくとしても...それは後であなたのために地雷を築きます。

于 2013-01-21T19:22:12.797 に答える