2009-05-14 6 views
1

dict.values()を呼び出すと、返される項目の順序はキーのhas値に依存します。これはcPythonのすべてのバージョンで非常に一貫しているようですが、dict simply states that the ordering is "arbitrary"のpythonマニュアルです。どのPEPがdict.values()の順序付けを支配していますか?

実際にitems()やvalues()メソッドの予想される順序を具体的に記述したPEPがあることを覚えています。

FYI、この動作が実際にクラスの保証された動作であれば、私が作業しているクラスを大幅に単純化してスピードアップすることができます。一方、これがcPythonの偶発的かつ文書化されていない機能に過ぎないのであれば、おそらくそれを信用しない方が良いでしょう。 http://docs.python.org/library/stdtypes.htmlから

答えて

6

IはPEP-3106がそれを取得限り近いと仮定:

仕様項目を .keys()、.values()と.items(によって返される順序で) であることを意味その命令はすべて から得られたものであるため、 (これはおそらく であり、dict が変更されていない限り任意ですが安定しています)から派生したものです(Python 2.xの場合と同じです)。これは、次の不変量に​​より を表すことができる。

list(d.items()) == list(zip(d.keys(), d.values()))

+0

ノート(その辞書が変更されるまで)の順序は、与えられたプラットフォーム上で、指定されたPythonのバージョンで与え辞書に対して一貫となること。したがって、実行中のコードの1つのインスタンス内で同じ方法で順序付けられた特定のdictに依存することはできますが、それを超えてはなりません。 もちろん、ディクテーションの順序に関連するものに決して依存しない方が良い方法です。 –

7

キーと値は、非ランダムで 任意の順序で記載されている、 は、Pythonの実装、 にわたって変化し、挿入および欠失の辞書の 履歴に依存します。

2

「任意」は「偶然」と同じではありません。

しかし、「文書化されていない」と同じです。辞書はハッシュに基づいているので、実際に発生するハッシュアルゴリズムと衝突に基づいて順序を保証することはできません。

注文を保証するには、sorted機能を使用してください。

または、Dictではなく、ordered dictionaryの実装を使用してください。