словник pprint у декількох рядках


81

Я намагаюся отримати симпатичний друк словника, але мені не пощастило:

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


Це відповідає на ваше запитання? Як красиво друкувати вкладені словники?
Георгій

@ Георгій не зовсім. Бажаний результат у цьому питанні не такий, як мій тут
mulllhausen

Відповіді:


99

Використовуйте width=1або width=-1:

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

1
Що роблять негативні ширини?
Тім

1
@Tim: Я просто спробував, і це спрацювало, але я не знаю, чи це десь задокументовано.
Warren Weckesser

1
Негативні ширини нічого особливого не роблять. По мірі проходження коду він перевіряє, чи довжина часткового вихідного рядка < width. Будь-яка від’ємна ширина просто означає, що відповідь завжди буде “ні”. Ширина 0 майже завжди (або, можливо, завжди - мені байдуже, щоб думати про збочені випадки ;-)) робитиме те саме.
Тім Пітерс,

1
@TimPeters: Так, я подивився джерело. Існує перевірка на ширину == 0 (це спричиняє помилку), але, схоже, 0 можна розглядати так само, як негативне значення - завжди відповідайте "ні", як ви сказали, - без шкоди.
Warren Weckesser

36

Ви можете перетворити dict на json через json.dumps(d, indent=4)

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

Набагато гарніший за інші рішення
Ерік Аронесті

4
@ErikAronesty Хоча вам слід звертати увагу на nullзначення логічного та логічного значення (true / false). Вони є значеннями JSON, а не об’єктами python.
Райан Чоу

1
Добре рішення для простих випадків, але перетворює значення 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)

3

Дві речі, які слід додати на додачу до вже дуже корисної відповіді Райана Чоу:

  • передайте sort_keysаргумент для полегшення візуального погляду на ваш дикт, особливо. якщо ви працюєте з версією Python до 3.6 (у якій словники не упорядковані)
print(json.dumps(item, indent=4, sort_keys=True))
"""
{
    "first": 123,
    "second": 456,
    "third": {
        "1": 1,
        "2": 2
    }
}
"""
  • dumps() буде працювати, лише якщо ключі словника є примітивними (рядки, int тощо)

Охайно! sort_keysце чудовий аргумент. На жаль, як ви говорите, не завжди застосовується: TypeError: Object of type Tag is not JSON serializable...
PatrickT
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.