pprint字典多行


78

我正在尝试漂亮地打印字典,但是我没有运气:

>>> import pprint
>>> a = {'first': 123, 'second': 456, 'third': {1:1, 2:2}}
>>> pprint.pprint(a)
{'first': 123, 'second': 456, 'third': {1: 1, 2: 2}}

我希望输出在多行中,如下所示:

{'first': 123,
 'second': 456,
 'third': {1: 1,
           2: 2}
}

pprint做到吗?如果不是,那么它是哪个模块?我正在使用Python 2.7.3


这回答了你的问题了吗?如何漂亮地打印嵌套词典?
乔治

@乔治不太。该问题的预期输出与此处的输出不同
穆尔豪森

Answers:


96

使用width=1width=-1

In [33]: pprint.pprint(a, width=1)
{'first': 123,
 'second': 456,
 'third': {1: 1,
           2: 2}}

1
负宽度有什么作用?
蒂姆(Tim)

1
@Tim:我只是尝试了一下,它奏效了,但是我不知道它是否记录在某处。
沃伦·韦克瑟

1
负宽度并没有什么特别的。随着代码的进行,它将检查部分输出字符串的长度是否为< width。任何负宽度仅表示答案将始终为“否”。宽度为0几乎总是(或者也许总是-我不在乎考虑不正常的情况;-))。
蒂姆·彼得斯

1
@TimPeters:是的,我看了一下消息来源。可以检查width == 0(这会引发错误),但是似乎可以将0视为负值,就像您所说的那样始终回答“否”,而不会造成任何伤害。
沃伦·韦克瑟

37

您可以通过将dict转换为json json.dumps(d, indent=4)

print(json.dumps(item, indent=4))
{
    "second": 456,
    "third": {
        "1": 1,
        "2": 2
    },
    "first": 123
}

比其他解决方案漂亮得多
Erik Aronesty

4
@ErikAronesty您应该注意null和布尔值(true / false)。它们是JSON值,而不是python对象。
Ryan Chou

好的解决方案适用于简单的情况,但是将python值转换为json值(如@RyanChou所指出的),可能不希望或不可能(如使用datetime):json.dumps({'d': datetime.now()})将崩溃Object of type datetime is not JSON serializable
安德烈,

25

如果要漂亮地打印环境变量,请使用:

pprint.pprint(dict(os.environ), width=1)

4

除了周恩来已经非常有用的答案外,还有两点要补充:

  • 传递sort_keys参数以使您的字典更容易视觉化,尤其是。如果您使用的是3.6之前版本的Python(字典是无序的)
print(json.dumps(item, indent=4, sort_keys=True))
"""
{
    "first": 123,
    "second": 456,
    "third": {
        "1": 1,
        "2": 2
    }
}
"""
  • dumps() 仅当字典键是基元(字符串,整数等)时才有效

整齐!sort_keys是一个很好的论点。不幸的是,正如您所说的并不总是适用:TypeError: Object of type Tag is not JSON serializable...
PatrickT
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.