1. ホーム
  2. python

[解決済み] python 辞書の値による降順での並べ替え

2022-03-02 07:49:13

質問

この辞書を、サブキーkey3の値に基づいて降順にソートしたい。以下を参照してください。

d = { '123': { 'key1': 3, 'key2': 11, 'key3': 3 },
      '124': { 'key1': 6, 'key2': 56, 'key3': 6 },
      '125': { 'key1': 7, 'key2': 44, 'key3': 9 },
    }

ですから、最終的な辞書は次のようになります。

d = { '125': { 'key1': 7, 'key2': 44, 'key3': 9 },
      '124': { 'key1': 6, 'key2': 56, 'key3': 6 },
      '123': { 'key1': 3, 'key2': 11, 'key3': 3 },
    }

しかし、key3の値が同じである可能性があるため、辞書eはkeyとその値の一部を失うことになる。

どうすれば実現できるのでしょうか?これはテストされたコードではありません。私はただロジックを理解しようとしているだけです。

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

辞書には固有の順序がない . というか、その固有の順序は "任意であるがランダムではない" なので、何の役にも立たない。

別の言い方をすれば、あなたの d と、あなたの e は全く同等の辞書となる。

ここでできることは OrderedDict :

from collections import OrderedDict
d = { '123': { 'key1': 3, 'key2': 11, 'key3': 3 },
      '124': { 'key1': 6, 'key2': 56, 'key3': 6 },
      '125': { 'key1': 7, 'key2': 44, 'key3': 9 },
    }
d_ascending = OrderedDict(sorted(d.items(), key=lambda kv: kv[1]['key3']))
d_descending = OrderedDict(sorted(d.items(), 
                                  key=lambda kv: kv[1]['key3'], reverse=True))

オリジナルの d には任意の順序があります。 d_ascending は、あなたが 思い を使用すると、元の d が、そうではありませんでした。そして d_descending には、あなたが望む順序があります。 e .


を使う必要がない場合は e の要素に対して反復処理を行いたいだけです。 d を特定の順序で実行すれば、これを簡略化することができます。

for key, value in sorted(d.items(), key=lambda kv: kv[1]['key3'], reverse=True):
    do_something_with(key, value)


変更後も辞書をソートした状態で維持したい場合、代わりに OrderedDict を使用すると、何らかのソートされた辞書が必要になります。PyPIで見つけられる多くのオプションがあり、あるものはツリーの上に実装され、あるものは OrderedDict 必要に応じて再ソートされる、など。