按键排序可读地打印Python字典
我想把一个Python字典打印到文件里,使用PrettyPrinter(为了让人看得更清楚),但是我希望输出的文件里的字典是按键排序的,这样更容易阅读。所以:
mydict = {'a':1, 'b':2, 'c':3}
pprint(mydict)
现在打印出来的是
{'b':2,
'c':3,
'a':1}
我想用PrettyPrint来打印这个字典,但希望它按键排序,比如说:
{'a':1,
'b':2,
'c':3}
这样做的最好方法是什么呢?
9 个回答
17
在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))
27
还有一个其他的选择:
>>> mydict = {'a':1, 'b':2, 'c':3}
>>> import json
然后用 Python 2:
>>> print json.dumps(mydict, indent=4, sort_keys=True) # python 2
{
"a": 1,
"b": 2,
"c": 3
}
或者用 Python 3:
>>> print(json.dumps(mydict, indent=4, sort_keys=True)) # python 3
{
"a": 1,
"b": 2,
"c": 3
}
110
其实在Python 2.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版本中,第二个排序的功能是缺失的(当时没有这个功能),所以在单行打印时,内容不会被排序。
所以答案似乎是使用Python 2.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))