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=1或width=-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.