可读地打印出按键排序的python dict()

可读地打印出按键排序的python dict(),python,Python,我想使用PrettyPrinter将python字典打印到一个文件中(用于人类可读性),但需要在输出文件中按键对字典进行排序,以进一步提高可读性。因此: mydict = {'a':1, 'b':2, 'c':3} pprint(mydict) 当前打印到 {'b':2, 'c':3, 'a':1} 我想把这本词典预印一下,但要按关键字分类打印出来 {'a':1, 'b':2, 'c':3} 最好的方法是什么?您可以稍微转换一下这个dict,以确保(因为dict没有在内部保持排序)

我想使用PrettyPrinter将python字典打印到一个文件中(用于人类可读性),但需要在输出文件中按键对字典进行排序,以进一步提高可读性。因此:

mydict = {'a':1, 'b':2, 'c':3}
pprint(mydict)
当前打印到

{'b':2,
 'c':3,
 'a':1}
我想把这本词典预印一下,但要按关键字分类打印出来

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

最好的方法是什么?

您可以稍微转换一下这个dict,以确保(因为dict没有在内部保持排序),例如


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


一般来说,如果您将数据结构写入文件,并希望它们具有可读性和可写性,您可能需要考虑使用类似YAML或JSON的替代格式。除非您的用户本身就是程序员,否则让他们通过
pprint
维护配置或应用程序状态并通过
eval
加载可能是一项令人沮丧且容易出错的任务。

实际上,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中,第二个sorted()丢失(当时不存在),因此打印在单行上的对象将无法排序

因此,答案似乎是使用python2.5,尽管这并不能完全解释问题中的输出

Python3更新

按排序键进行漂亮打印(lambda x:x[0]):

按排序值打印(λx:x[1]):


我编写了以下函数以更可读的格式打印dict、list和tuple:

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)

我和你有同样的问题。我使用了一个for循环,其中sorted函数传入字典,如下所示:

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

在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\u example.items()
返回元组,然后可以通过
sorted()
对元组进行排序:

下面是一个漂亮地打印Python字典值的排序内容的示例

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

>>> 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
}
或者使用python 3:

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

另一条短线:

mydict = {'c': 1, 'b': 2, 'a': 3}
print(*sorted(mydict.items()), sep='\n')

结果表明,pprint已按键进行排序。应该更仔细地检查它。顺便说一句,
ast.literal\u eval(“{a':0,'b':1,2'c'}”)
->
{2'c','a':0,'b':1}
,所以不需要不虔诚的
eval
。是的,显然pprint没有提供关闭此行为的方法。浪费了一两个小时试图弄明白为什么一些pprint示例报表数据按键排序。非常好。下面是一个非常好地打印Python字典排序内容的示例值:
for key,value in sorted(dict_example.items(),key=lambda d_items:d_items[1]):print(“{}:{}.format(key,value))
@ScottSkiles您应该编辑答案并添加示例-我认为这将有助于未来的读者Python 3,lambda表达式解决方案是光滑的。为清楚起见,我相信(?)
key
in
对于key,value in…
独立于
key
in
key=lambda…
因为这样做,
对于k,v在排序中(token\u dict.items(),key=lambda x:x[0])
但是
对于k,v在排序中(token dict.items(),k=lambda x:x[0])/code>抛出了一个错误。这既短又甜蜜,但只打印键,不打印值。
>>> mydict = {'a':1, 'b':2, 'c':3}
>>> import json
>>> print json.dumps(mydict, indent=4, sort_keys=True) # python 2
{
    "a": 1, 
    "b": 2, 
    "c": 3
}
>>> print(json.dumps(mydict, indent=4, sort_keys=True)) # python 3
{
    "a": 1, 
    "b": 2, 
    "c": 3
}
mydict = {'c': 1, 'b': 2, 'a': 3}
print(*sorted(mydict.items()), sep='\n')