辞書のキーの順序


101

コード:

d = {'a': 0, 'b': 1, 'c': 2}
l = d.keys()

print l

これは印刷し['a', 'c', 'b']ます。メソッドがlkeys()内のキーワードの順序をどのように決定するのかわかりません。ただし、「適切な」順序でキーワードを取得できるようにしたいと考えています。もちろん、正しい順序でリストが作成されます。['a', 'b', 'c']


3
Python辞書がほとんどの場合、それらは実際にはハッシュテーブルです。とりわけ、これはキーの順序が保証されていないか、指定されていないことを意味します。特に、キーが追加された順序を覚えていません。
cHao

3
@cHao:これは本質的に、辞書の要素をループするとプログラムが不確定になることを意味しますか?
HelloGoodbye 2014年

4
@HelloGoodbye:私はそんなに遠くに行かないでしょう。まだ非常に予測可能な動作があります。完全な反復ごとに、各キー/値ペアの1つだけが表示されます。また、ほとんどの言語では、毎回同じ順序で表示されます。ただし、ドキュメントで特定の順序が保証されている場合を除き、それが必要な順序であることを期待すべきではありません。(いくつかの言語(Perlのような)は実際には順序を少しランダム化します-おそらくセキュリティ上の理由からですが、私は本当に不特定の振る舞いに依存する習慣からあなたを揺さぶるだけだと思います。:)私はPythonがかなりだと思いませんその悪、しかし
ええと

1
dictが変更されていなければ、順序は同じです。マニュアルから:「items()、keys()、values()、iteritems()、iterkeys()、およびitervalues()が辞書への変更なしで呼び出された場合、リストは直接対応します。これにより、作成が可能になります。 zip()を使用した(値、キー)ペアのペア:ペア= zip(d.values()、d.keys())。 "
steveayre 2015

2
@sfranky steveayreが意味することは、要素が記述されたordrerと同じではなく、前述のさまざまなメソッドを使用して取得したものの間で順序が同じであることだと思います。
bli

回答:


78

OrderedDict(Python 2.7が必要)以上を使用できます。

また、で作成したはすでに要素の順序を忘れているため、機能しOrderedDict({'a': 1, 'b':2, 'c':3})ません。代わりに、を使用します。dict{...}OrderedDict([('a', 1), ('b', 2), ('c', 3)])

ドキュメントで述べたように、Python 2.7より前のバージョンでは、このレシピを使用できます。


18
OrderedDictの順序は挿入順序です。キーは、そのように挿入した場合にのみアルファベット順に表示されます。
ヒュー・ボスウェル、2011

それは彼簡単な例として示したものです。それは、彼が実際にそれを使用することを計画している方法とは関係がないかもしれません。OrderedDictがソートされた順序で任意の挿入を返すことを期待していた人に以前遭遇したので、私はこれを指摘する必要があると感じました。
ヒュー・ボスウェル

118

Python 3.7以降

Python 3.7.0では、dictオブジェクトの挿入順序保持の性質がPython言語仕様の公式の一部であると宣言されています。したがって、それに依存することができます。

Python 3.6(CPython)

Python 3.6以降、PythonのCPython実装では、辞書デフォルトで挿入順序を維持します。ただし、これは実装の詳細と見なされます。collections.OrderedDictPythonの他の実装全体で保証されている挿入順序が必要な場合は、引き続き使用する必要があります。

Python> = 2.7および<3.6

挿入されたアイテムの順序を記憶するcollections.OrderedDictが必要な場合にクラスを使用しますdict


48
>>> print sorted(d.keys())
['a', 'b', 'c']

渡された反復可能オブジェクトをソートするソート関数を使用します。

この.keys()メソッドは、キーを任意の順序で返します。


12
元の順序が必要で、ソートされていない場合、これは機能しません。
Simon

12

使いたいときにリストをソートするだけです。

l = sorted(d.keys())

12

http://docs.python.org/tutorial/datastructures.htmlから:

「ディクショナリオブジェクトのkeys()メソッドは、ディクショナリで使用されているすべてのキーのリストを任意の順序で返します(ソートする場合は、sorted()関数を適用するだけです)。


1

辞書はハッシュマップなので、順序は関係ありません。それはそれがどのように押し込まれるかの順序に依存します:

s = 'abbc'
a = 'cbab'

def load_dict(s):
    dict_tmp = {}
    for ch in s:
        if ch in dict_tmp.keys():
            dict_tmp[ch]+=1
        else:
            dict_tmp[ch] = 1
    return dict_tmp

dict_a = load_dict(a)
dict_s = load_dict(s)
print('for string %s, the keys are %s'%(s, dict_s.keys()))
print('for string %s, the keys are %s'%(a, dict_a.keys()))

出力:
文字列abbcの場合、キーはdict_keys(['a'、 'b'、 'c'])
です。文字列cbabの場合、キーはdict_keys(['c'、 'b'、 'a'])です。


1
Pythonのディクショナリは、バージョン3.6以降からのみ挿入の順序になっています。これをチェックしてください
Crivella
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.