web-dev-qa-db-ja.com

辞書をキーで数値順にソートする方法Python

辞書は次のようになります。

_{'57481': 50, '57480': 89, '57483': 110, '57482': 18, '57485': 82, '57484': 40}  
_

辞書を数値順に並べ替えたいのですが、結果は次のようになります。

_{'57480': 89, '57481': 50, '57482': 18, '57483': 110, '57484': 40, '57485': 82} 
_

sorted(self.docs_info.items)を試しましたが、うまくいきません。

15
Justin

キーのみでソートする必要がある場合は、すでに95%です。辞書が_docs_info_と呼ばれていると仮定すると:

_for key, value in sorted(docs_info.items()): # Note the () after items!
    print(key, value)
_

辞書キーは常に一意であるため、docs_info.items()(タプルのシーケンス)でsortedを呼び出すことは、キーのみでソートすることと同等です。

数字を含む文字列が直感的にソートされないことに注意してください!例えば_"11"_は、_"2"_よりも「小さい」。数値順にソートする必要がある場合は、intではなくstrキーを作成することをお勧めします。例えば.

_int_docs_info = {int(k) : v for k, v in docss_info.items()}
_

もちろん、これはあなたがaccess辞書要素の順序を変更するだけで、通常はこれで十分です(アクセスしていない場合、ソートされていれば何が問題になりますか?)。何らかの理由で辞書自体を「ソート」する必要がある場合は、_collections.OrderedDict_を使用する必要があります。これは、アイテムが挿入された順序を覚えています。したがって、最初に辞書をソートし(上記のように)、ソートした(キー、値)ペアからOrderedDictを作成できます。

_sorted_docs_info = collections.OrderedDict(sorted(docs_info.items()))
_
16
Henry Keiter

標準Python dictsは「順不同」です。OrderedDictを使用できます。 docs をご覧ください。

from collections import OrderedDict

d = {'57481': 50, '57480': 89, '57483': 110, '57482': 18, '57485': 82, '57484': 40}
OrderedDict(sorted(d.items(), key=lambda t: t[0]))
# OrderedDict([('57480', 89), ('57481', 50), ('57482', 18), ('57483', 110), ('57484', 40), ('57485', 82)])
8
elyase

繰り返し要素を並べ替えて順序付けられた辞書に挿入するのが遅すぎる場合は、PyPIで並べ替えられた辞書実装の1つを検討してください。 SortedDict データ型は、キーをソート順に効率的に維持します。 sortedcontainers モジュールには、そのような実装が1つ含まれています。

PyPIからのインストールは簡単です:

pip install sortedcontainers

pip installができない場合は、sortedlist.pyファイルとsortdictdict.pyファイルを open-source repository からコピーしてください。 SortedContainersはpure-Pythonで実装されていますが、fast-as-C実装です。

簡単にインストールしたら:

In [1]: from sortedcontainers import SortedDict

In [6]: SortedDict({'57481': 50, '57480': 89, '57483': 110, '57482': 18, '57485': 82, '57484': 40})
Out[6]: SortedDict({'57480': 89, '57481': 50, '57482': 18, '57483': 110, '57484': 40, '57485': 82})

また、sortedcontainersモジュールは、いくつかの一般的な実装の パフォーマンス比較 を維持します。

5
GrantJ