キーでソートされたPythondict()を読みやすく印刷します


82

(人間が読みやすいように)PrettyPrinterを使用してPython辞書をファイルに印刷したいのですが、読みやすさをさらに向上させるために、出力ファイルのキーで辞書を並べ替えます。そう:

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

現在、

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

辞書をPrettyPrintしたいのですが、キーでソートして印刷してもらいます。

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

これを行うための最良の方法は何ですか?

python 

pprintはすでにキーでソートされていることがわかります。もっと注意深くチェックすべきだった。

回答:


94

実際、pprintはpython2.5でキーをソートしているようです

>>> 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}

ただし、Python2.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アップデート

ソートされたキーによるプリティプリント(ラムダx:x [0]):

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

ソートされたによるプリティプリント(ラムダx:x [1]):

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

Python 3、ラムダ式のソリューションは洗練されています。明確にするために、私は信じている(?)keyfor key, value in ...は独立しているkeykey=lambda ...、この作品のように、for k,v in sorted(token_dict.items(), key=lambda x: x[0])しかし、for k,v in sorted(token_dict.items(), k=lambda x: x[0])エラーがスローされます。
VictoriaStuart20年

19

別の選択肢:

>>> mydict = {'a':1, 'b':2, 'c':3}
>>> import json

次にpython2で:

>>> print json.dumps(mydict, indent=4, sort_keys=True) # python 2
{
    "a": 1, 
    "b": 2, 
    "c": 3
}

またはPython3で:

>>> print(json.dumps(mydict, indent=4, sort_keys=True)) # python 3
{
    "a": 1, 
    "b": 2, 
    "c": 3
}

14

Python 3で、辞書のソートされたコンテンツを印刷する簡単な方法。

>>> dict_example = {'c': 1, 'b': 2, 'a': 3}
>>> for key, value in sorted(dict_example.items()):
...   print("{} : {}".format(key, value))
... 
a : 3
b : 2
c : 1

dict_example.items()はタプルを返します。タプルは次のように並べ替えることができますsorted()

>>> dict_example.items()
dict_items([('c', 1), ('b', 2), ('a', 3)])
>>> sorted(dict_example.items())
[('a', 3), ('b', 2), ('c', 1)]

以下は、Pythonディクショナリの値のソートされたコンテンツをプリティプリントする例です。

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

非常に素晴らしい。ここではかなりPythonの辞書値のソートされた内容を印刷する例である:for key, value in sorted(dict_example.items(), key=lambda d_items: d_items[1]): print("{} : {}".format(key, value))
スコット・スカイルズ

1
@ScottSkilesは答えを編集し、それに例を追加する必要があります-将来の読者に役立つと思います
redbeam_ 2018年

13

Pythonpprintモジュールは、実際にはすでに辞書をキーで並べ替えています。Python 2.5より前のバージョンでは、並べ替えは、きれいに印刷された表現が複数行にまたがる辞書でのみトリガーされていましたが、2.5.Xおよび2.6.Xでは、すべての辞書が並べ替えられます。

ただし、一般的に、データ構造をファイルに書き込んでいて、人間が読み取りおよび書き込みできるようにしたい場合は、YAMLやJSONなどの代替形式の使用を検討することをお勧めします。ユーザー自身がプログラマーでない限り、ユーザーに構成またはアプリケーションの状態を維持させることは、を介してダンプpprintおよびロードするevalことは、苛立たしく、エラーが発生しやすいタスクになる可能性があります。


2
ところで、ast.literal_eval("{'a': 0, 'b': 1, 2: 'c'}")->{2: 'c', 'a': 0, 'b': 1}だから、陰険な必要はありませんeval
jfs 2009

はい、どうやらpprintはこの動作をオフにする方法を提供していません。一部のpprintサンプルレポートデータがキーで並べ替えられている理由を理解しようとして、1〜2時間無駄になりました。
サマンサアトキンス

12

dict、リスト、タプルをより読みやすい形式で出力するために、次の関数を作成しました。

def printplus(obj):
    """
    Pretty-prints the object passed in.

    """
    # Dict
    if isinstance(obj, dict):
        for k, v in sorted(obj.items()):
            print u'{0}: {1}'.format(k, v)

    # List or tuple            
    elif isinstance(obj, list) or isinstance(obj, tuple):
        for x in obj:
            print x

    # Other
    else:
        print obj

iPythonでの使用例:

>>> dict_example = {'c': 1, 'b': 2, 'a': 3}
>>> printplus(dict_example)
a: 3
b: 2
c: 1

>>> tuple_example = ((1, 2), (3, 4), (5, 6), (7, 8))
>>> printplus(tuple_example)
(1, 2)
(3, 4)
(5, 6)
(7, 8)

5

私はあなたが持っていたのと同じ問題を抱えていました。次のように、ソートされた関数が辞書を渡すforループを使用しました。

for item in sorted(mydict):
    print(item)

4

この辞書を少し変換して、(辞書は内部で並べ替えられないため)次のようにすることができます。

pprint([(key, mydict[key]) for key in sorted(mydict.keys())])

0

別の短いワンライナー:

mydict = {'c': 1, 'b': 2, 'a': 3}
print(*sorted(mydict.items()), sep='\n')
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.