web-dev-qa-db-ja.com

なぜpythonのように辞書を注文するのですか?

ここに私が持っている辞書があります

propertyList = {
    "id":           "int",
    "name":         "char(40)",

    "team":         "int",
    "realOwner":    "int",

    "x":            "int",
    "y":            "int",

    "description":  "char(255)",

    "port":         "bool",
    "secret":       "bool",
    "dead":         "bool",
    "nomadic":      "bool",

    "population":   "int",
    "slaves":       "int",
}

しかし、「\ n」.join(myDict)で出力すると、これが得られます

name
nomadic
dead
port
realOwner
secret
slaves
team
y
x
population
id
description

辞書は順序付けられていないことは知っていますが、毎回同じ辞書が出てくるので、理由はわかりません。

41
Teifion

Pythonの古いバージョンの場合、本当の質問は「なぜですか?」 —順序付けされていない辞書は通常、 ハッシュテーブルとして実装されます。 要素の順序は明確ですが、すぐにはわかりません( the Pythonこれを述べるために使用されるドキュメント )。観察結果はハッシュテーブルのルールに完全に一致します。見た目は任意ですが、一定の順序です。

それ以降、Pythonはdictの実装を変更して挿入の順序を保持し、 これはguaranteed Python 3.7 。したがって、実装はもはや純粋なハッシュテーブルを構成しません(ただし、ハッシュテーブルは実装ではまだsedです)。

79
Konrad Rudolph

組み込み辞書タイプの specification は、順序の保持を放棄します。辞書をkey: valueペアの順序付けられていないセットと考えるのが最善です...

OrderedDict module を確認することをお勧めします。これは、キー挿入順序を使用した順序付き辞書の実装です。

10
CMS

信頼できる辞書の順序付けに関する唯一のことは、辞書に変更がなければ順序は変わらないということです。たとえば、辞書を変更せずに2回反復すると、同じキーシーケンスになります。ただし、Python辞書の順序は決定的ですが、挿入および削除の順序などの要因の影響を受ける可能性があるため、等しい辞書は異なる順序で終わる可能性があります。

>>> {1: 0, 2: 0}, {2: 0, 1: 0}
({1: 0, 2: 0}, {1: 0, 2: 0})
>>> {1: 0, 9: 0}, {9: 0, 1: 0}
({1: 0, 9: 0}, {9: 0, 1: 0})
8
Miles