Есть ли способ правильно распечатать заказанные словари? - PullRequest
86 голосов
/ 29 ноября 2010

Мне нравится модуль pprint в Python. Я часто использую его для тестирования и отладки. Я часто использую параметр ширины, чтобы убедиться, что выходные данные хорошо вписываются в мое окно терминала.

Он работал нормально, пока не добавили новый упорядоченный тип словаря в Python 2.7 (еще одна интересная функция, которая мне действительно нравится). Если я попытаюсь напечатать заказной словарь, он не будет отображаться. Вместо того, чтобы каждая пара ключ-значение находилась в отдельной строке, все это отображается в одной длинной строке, которая многократно переносится и ее трудно прочитать.

У кого-нибудь здесь есть способ заставить его печататься красиво, как старые неупорядоченные словари? Я мог бы что-то выяснить, возможно, используя метод PrettyPrinter.format, если бы я потратил достаточно времени, но мне интересно, если кто-нибудь здесь уже знает о решении.

ОБНОВЛЕНИЕ: Я отправил отчет об ошибке для этого. Вы можете увидеть это на http://bugs.python.org/issue10592.

Ответы [ 13 ]

0 голосов
/ 10 августа 2018

Вот мой подход к красивой печати OrderedDict

from collections import OrderedDict
import json
d = OrderedDict()
d['duck'] = 'alive'
d['parrot'] = 'dead'
d['penguin'] = 'exploded'
d['Falcon'] = 'discharged'
print d
print json.dumps(d,indent=4)

OutPut:

OrderedDict([('duck', 'alive'), ('parrot', 'dead'), ('penguin', 'exploded'), ('Falcon', 'discharged')])

{
    "duck": "alive",
    "parrot": "dead",
    "penguin": "exploded",
    "Falcon": "discharged"
}

Если вы хотите печатать довольно словарь с ключами в отсортированном порядке

print json.dumps(indent=4,sort_keys=True)
{
    "Falcon": "discharged",
    "duck": "alive",
    "parrot": "dead",
    "penguin": "exploded"
}
0 голосов
/ 22 января 2014

Если все элементы словаря одного типа, вы можете использовать удивительную библиотеку обработки данных pandas:

>>> import pandas as pd
>>> x = {'foo':1, 'bar':2}
>>> pd.Series(x)
bar    2
foo    1
dtype: int64

или

>>> import pandas as pd
>>> x = {'foo':'bar', 'baz':'bam'}
>>> pd.Series(x)
baz    bam
foo    bar
dtype: object
0 голосов
/ 29 ноября 2010

Вы можете переопределить pprint() и перехватывать вызовы для OrderedDict. Вот простая иллюстрация. Как написано, код переопределения OrderedDict игнорирует любые необязательные ключевые слова stream, indent, width или depth, которые могли быть переданы, но могут быть улучшены для их реализации. К сожалению, этот метод не обрабатывает их внутри другого контейнера, такого как list из OrderDict s

from collections import OrderedDict
from pprint import pprint as pp_pprint

def pprint(obj, *args, **kwrds):
    if not isinstance(obj, OrderedDict):
        # use stock function
        return pp_pprint(obj, *args, **kwrds)
    else:
        # very simple sample custom implementation...
        print "{"
        for key in obj:
            print "    %r:%r" % (key, obj[key])
        print "}"

l = [10, 2, 4]
d = dict((('john',1), ('paul',2), ('mary',3)))
od = OrderedDict((('john',1), ('paul',2), ('mary',3)))
pprint(l, width=4)
# [10,
#  2,
#  4]
pprint(d)
# {'john': 1, 'mary': 3, 'paul': 2}

pprint(od)
# {
#     'john':1
#     'paul':2
#     'mary':3
# }
...