Python辞書:keys()とvalues()は常に同じ順序ですか?


312

によって返されるリストkeys()values()ディクショナリのメソッドは常に1対1のマッピングのように見えます(ディクショナリは2つのメソッドの呼び出し間で変更されないと想定しています)。

例えば:

>>> d = {'one':1, 'two': 2, 'three': 3}
>>> k, v = d.keys(), d.values()
>>> for i in range(len(k)):
    print d[k[i]] == v[i]

True
True
True

呼び出しkeys()と呼び出しの間で辞書を変更しない場合values()、上記のforループが常にTrueを出力すると想定するのは間違っていますか?これを確認するドキュメントは見つかりませんでした。


1
CPython 3.7(およびおそらくそれ以上)では、辞書の一致する挿入順序の反復順序に依存する場合があります。mail.python.org/pipermail/python-dev/2017-December/151283.html
BallpointBen

@BallpointBenこれは、CPython 3.6以降およびPython 3.7以降のその他すべてのPython実装に含まれています
Boris

回答:


353

これが見つかりました:

場合はitems()keys()values()iteritems()iterkeys()、および itervalues()辞書に介在しない変更で呼び出され、リストが直接対応します。

オン2.xのドキュメントおよび3.xのドキュメント


5
明らかに、3.xドキュメントのステートメントはより明確です:「アイテムの順序は直接対応します」
Shaohua Li

4
このテキストは3.7のドキュメントにはありません。それは3.7の「Dictが挿入順序を保持する」ためだとしか言えません:mail.python.org/pipermail/python-dev/2017-December/151283.html
EliadL

80

はい、あなたが観察したものは確かに保証されたプロパティです-dictsが変更されていない場合、keys()、values()、items()は一致した順序でリストを返します。iterkeys()&cも、対応するリストと同じ順序で反復します。


1
ただし、リスト変更された場合、Pandas dataframeはアイテムを更新または削除できる代替手段を提供し、dictのような構造でのアイテムの順序とインデックスの場所は固定されたままです。
Ville



6

ドキュメントへの良い参照。ドキュメント/実装に関係なく、順序を保証する方法は次のとおりです。

k, v = zip(*d.iteritems())

1
python3.xでは、dict.items()を使用します
Good Will


4

それだけの価値があるので、私が書いた使用頻度の高いプロダクションコードはこの仮定に基づいており、問題が発生することはありません。私はそれがそれを真実にしないことを知っています:-)

リスクを冒したくない場合は、可能であればiteritems()を使用します。

for key, value in myDictionary.iteritems():
    print key, value

-2

異なる辞書を使用している場合でも、エクスポートされた値が同じ順序になるようにしたかったので、これらの答えに満足できませんでした。

ここでは、キーの順序を事前に指定します。dictが変更されたり、別のdictを使用したりしても、戻り値は常に同じ順序になります。

keys = dict1.keys()
ordered_keys1 = [dict1[cur_key] for cur_key in keys]
ordered_keys2 = [dict2[cur_key] for cur_key in keys]
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.