按键排序可读地打印Python字典

94 投票
9 回答
168772 浏览
提问于 2025-04-15 14:36

我想把一个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))

撰写回答