1. ホーム
  2. python

[解決済み] 辞書を値で並べ替えるにはどうしたらいいですか?

2022-03-18 20:03:32

質問内容

データベース内の2つのフィールド(文字列フィールドと数値フィールド)から読み取った値の辞書を持っています。文字列フィールドは一意であるため、これが辞書のキーとなる。

キーでソートすることはできますが、値でソートするにはどうしたらよいのでしょうか?

注:Stack Overflowの質問はこちらです。 辞書のリストを辞書の値でソートするにはどうすればよいですか? しかし、私は本当に辞書のリストを必要としないので、昇順または降順のいずれかでソートするためのより簡単なソリューションがあるかどうかを知りたかったのです。

どのように解決するのですか?

Python 3.7+ または CPython 3.6

Python 3.7+では、ディクツは挿入順序を保持します。CPython 3.6でも同じですが これは実装の詳細です。 .

>>> x = {1: 2, 3: 4, 4: 3, 2: 1, 0: 0}
>>> {k: v for k, v in sorted(x.items(), key=lambda item: item[1])}
{0: 0, 2: 1, 1: 2, 4: 3, 3: 4}

または

>>> dict(sorted(x.items(), key=lambda item: item[1]))
{0: 0, 2: 1, 1: 2, 4: 3, 3: 4}

古いPython

辞書をソートすることはできませんが、ソートされた辞書の表現を得ることだけは可能です。辞書は本質的に無秩序ですが、リストやタプルのような他の型は無秩序ではありません。したがって、ソートされた値を表現するためには、順序付きデータ型が必要です。これは、リスト、おそらくタプルのリストになります。

例えば、以下のようなものです。

import operator
x = {1: 2, 3: 4, 4: 3, 2: 1, 0: 0}
sorted_x = sorted(x.items(), key=operator.itemgetter(1))

sorted_x は、各タプルの2番目の要素でソートされたタプルのリストとなります。 dict(sorted_x) == x .

そして、値ではなくキーでソートしたい人のために。

import operator
x = {1: 2, 3: 4, 4: 3, 2: 1, 0: 0}
sorted_x = sorted(x.items(), key=operator.itemgetter(0))

Python3以降では を解凍することはできません。 を使用することができます。

x = {1: 2, 3: 4, 4: 3, 2: 1, 0: 0}
sorted_x = sorted(x.items(), key=lambda kv: kv[1])

ディクショナリーとして出力させたい場合は collections.OrderedDict :

import collections

sorted_dict = collections.OrderedDict(sorted_x)