【问题标题】:Readably print out a python dict() sorted by key可读打印出一个按键排序的python dict()
【发布时间】:2009-09-25 21:22:11
【问题描述】:

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

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

当前打印到

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

我想把字典打印出来,但要按键排序,例如打印出来。

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

最好的方法是什么?

【问题讨论】:

  • 原来 pprint 已经按键排序了。应该更仔细地检查一下。

标签: python


【解决方案1】:

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

但并不总是在 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 中缺少第二个 sorted()(当时不存在),因此打印在单行上的对象不会被排序。

所以答案似乎是使用 python2.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))

【讨论】:

  • Python 3 的 lambda 表达式解决方案非常巧妙。为了清楚起见,我相信(?)for key, value in ... 中的key 独立于key=lambda ... 中的key,因为这是有效的,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]) 会引发错误。
【解决方案2】:

另一种选择:

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 顺便说一句,ast.literal_eval("{'a': 0, 'b': 1, 2: 'c'}") -> {2: 'c', 'a': 0, 'b': 1} 所以不需要不虔诚的eval
    • 是的,显然 pprint 没有提供关闭此行为的方法。浪费了一两个小时试图弄清楚为什么某些 pprint 示例报告数据按键排序。
    【解决方案4】:

    在 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))
    • @ScottSkiles 您应该编辑答案并将您的示例添加到其中 - 我认为这会对未来的读者有所帮助
    【解决方案5】:

    我编写了以下函数来以更易读的格式打印字典、列表和元组:

    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)
    

    【讨论】:

      【解决方案6】:

      我遇到了和你一样的问题。我使用了一个 for 循环,排序函数在字典中传递,如下所示:

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

      【讨论】:

      • 这很简短,但只打印键而不是值。
      【解决方案7】:

      您可以稍微改变这个字典以确保(因为字典不会在内部保持排序),例如

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

      【讨论】:

        【解决方案8】:

        另一个简短的单线:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-09-29
          • 1970-01-01
          • 2018-03-26
          • 2017-12-27
          相关资源
          最近更新 更多