读取打印出一个python字典()按键sorting

我想使用PrettyPrinter(为了便于阅读)将一个Python字典打印到一个文件中,但是要通过输出文件中的键对字典进行sorting以进一步提高可读性。 所以:

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

当前打印到

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

我想漂亮的打印字典,但打印出按键sorting,例如。

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

做这个的最好方式是什么?

实际上,pprint似乎是在python2.5下为你sorting的

 >>> 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)的源代码,它会使用sorting字典

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

多行或单行

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

在它试图打印任何东西之前,所以如果你的字典正确地sorting,那么它应该正确打印。 在2.4中,第二个sorting的()被遗漏(当时不存在),所以打印在一行上的对象将不会被sorting。

所以答案似乎是使用python2.5,虽然这不能解释你的问题的输出。

Python的pprint模块实际上已经通过键sorting字典。 在Python 2.5之前的版本中,sorting仅在其漂亮打印的表示跨越多行的字典上被触发,但在2.5.X和2.6.X中, 所有字典都被sorting。

但是,通常情况下,如果要将数据结构写入文件并希望它们具有人类可读性和可写性,则可能需要考虑使用其他格式,如YAML或JSON。 除非你的用户是他们自己的程序员,让他们保持configuration或应用程序状态通过pprint转储并通过eval加载可能是一个令人沮丧和容易出错的任务。

我写了下面的函数以更可读的格式打印字典,列表和元组:

 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) 

在Python 3中打印字典的sorting内容的简单方法:

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

expression式dict_example.items()返回元组,然后可以通过sorted()来sorting:

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

另一种select:

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

你可以稍微改变一下这个词典,以确保(因为字典不是内部sorting的),例如

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

我有同样的问题,你有。 我使用了一个for循环与传递在字典中的sorting函数,如下所示:

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