1. ホーム
  2. python

[解決済み] キーでソートされたpython dict()を読みやすくプリントアウトする

2023-05-22 15:16:10

質問

私はPrettyPrinterを使用してPython辞書をファイルに印刷したいのですが(人間が読むために)、さらに読みやすさを向上させるために、辞書を出力ファイルのキーでソートさせたいと思います。そこで

mydict = {'a':1, 'b':2, 'c':3}
pprint(mydict)

は現在

{'b':2,
 'c':3,
 'a':1}

辞書をPrettyPrintしたいのですが、例えばキーでソートして出力させたいのですが。

{'a':1,
 'b':2,
 'c':3}

どのような方法があるのでしょうか?

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

python2.5では、pprintがキーをソートしてくれるようです。

>>> from pprint import pprint
>>> mydict = {'a':1, 'b':2, 'c':3}
>>> pprint(mydict)
{'a': 1, 'b': 2, 'c': 3}
>>> mydict = {'a':1, 'b':2, 'c':3, 'd':4, 'e':5}
>>> pprint(mydict)
{'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5}
>>> d = dict(zip("kjihgfedcba",range(11)))
>>> pprint(d)
{'a': 10,
 'b': 9,
 'c': 8,
 'd': 7,
 'e': 6,
 'f': 5,
 'g': 4,
 'h': 3,
 'i': 2,
 'j': 1,
 'k': 0}

しかし、python 2.4 では必ずしもそうではありません。

>>> from pprint import pprint
>>> mydict = {'a':1, 'b':2, 'c':3, 'd':4, 'e':5}
>>> pprint(mydict)
{'a': 1, 'c': 3, 'b': 2, 'e': 5, 'd': 4}
>>> d = dict(zip("kjihgfedcba",range(11)))
>>> pprint(d)
{'a': 10,
 'b': 9,
 'c': 8,
 'd': 7,
 'e': 6,
 'f': 5,
 'g': 4,
 'h': 3,
 'i': 2,
 'j': 1,
 'k': 0}
>>> 

pprint.py (2.5)のソースコードを読むと、辞書をソートするのに

items = object.items()
items.sort()

は複数行の場合、これは一行の場合

for k, v in sorted(object.items()):

のように辞書が正しくソートされていれば、正しく印刷されるはずです。 2.4 では、2 番目の sorted() がないので (当時は存在しませんでした)、1 行に出力されたオブジェクトはソートされません。

というわけで、答えはpython2.5を使うことになるようですが、これは質問の出力を完全に説明するものではありません。

Python3 の更新

ソート済みできれいな印刷 キー (lambda x: x[0])で表示します。

for key, value in sorted(dict_example.items(), key=lambda x: x[0]): 
    print("{} : {}".format(key, value))

並べ替えできれいに印刷 (lambda x: x[1])で表示します。

for key, value in sorted(dict_example.items(), key=lambda x: x[1]): 
    print("{} : {}".format(key, value))