Мне нравится модуль pprint в Python. Я часто использую его для тестирования и отладки. Я часто использую параметр ширины, чтобы вывод хорошо вписывался в окно моего терминала.
Он работал нормально, пока они не добавили новый тип упорядоченного словаря в Python 2.7 (еще одна интересная функция, которая мне очень нравится). Если я попытаюсь красиво распечатать упорядоченный словарь, это не будет хорошо отображаться. Вместо того чтобы располагать каждую пару «ключ-значение» в отдельной строке, все это отображается в одной длинной строке, которая повторяется много раз и ее трудно читать.
Есть ли у кого-нибудь здесь способ заставить его печатать красиво, как старые неупорядоченные словари? Я, вероятно, смогу что-то выяснить, возможно, используя метод PrettyPrinter.format, если потрачу достаточно времени, но мне интересно, знает ли кто-нибудь здесь уже решение.
ОБНОВЛЕНИЕ: я отправил отчет об ошибке для этого. Вы можете увидеть это на http://bugs.python.org/issue10592 .
источник
Ответы:
В качестве временного решения вы можете попробовать сделать дамп в формате JSON. Вы теряете некоторую информацию о типе, но она выглядит красиво и сохраняет порядок.
источник
pprint.pprint(dict(data))
?pprint.pprint(dict(data))
работает хорошо, если вам не важен порядок клавиш. Лично я хочу, чтобы__repr__
forOrderedDict
производил такой вывод, но с сохранением порядка ключей.Следующее будет работать, если порядок вашего OrderedDict является альфа-сортировкой, поскольку pprint будет сортировать dict перед печатью.
источник
dict
должно избежать проблемы размещения всего в одной строке.Вот еще один ответ, который работает путем
pprint()
внутреннего переопределения и использования функции акций . В отличие от моего более раннего, он будет обрабатыватьOrderedDict
внутри другого контейнера, такого как a,list
и также должен иметь возможность обрабатывать любые заданные необязательные аргументы ключевого слова - однако он не имеет такой же степени контроля над выводом, как другой.Он работает путем перенаправления вывода стандартной функции во временный буфер, а затем переносит его по словам перед отправкой в выходной поток. Хотя конечный результат не является исключительно красивым, он приличный и может быть «достаточно хорошим» для использования в качестве обходного пути.
Обновление 2.0
Упрощен за счет использования стандартного библиотечного
textwrap
модуля и модифицирован для работы как в Python 2, так и в 3.Пример вывода:
»
{'john': 1, 'mary': 3, 'paul': 2}
»
OrderedDict([('john', 1), ('paul', 2),
('mary', 3)])
»
[OrderedDict([('john', 1), ('paul', 2),
('mary', 3)]), OrderedDict([('moe', 1),
('curly', 2), ('larry', 3)]),
OrderedDict([('weapons', 1), ('mass',
2), ('destruction', 3)])]
источник
Чтобы напечатать заказанный dict, например
я делаю
Что дает
или
что дает
источник
Вот способ взлома реализации
pprint
.pprint
сортирует ключи перед печатью, поэтому для сохранения порядка нам просто нужно настроить сортировку ключей так, как мы хотим.Обратите внимание, что это влияет на
items()
функцию. Таким образом, вы можете сохранить и восстановить переопределенные функции после выполнения pprint.источник
Вот мой подход к красивой печати OrderedDict
Если вы хотите красиво распечатать словарь с ключами в отсортированном порядке
источник
python3
. Пожалуйста, проверьтеЭто довольно грубо, но мне просто нужен был способ визуализировать структуру данных, состоящую из любых произвольных сопоставлений и итераций, и это то, что я придумал, прежде чем сдаться. Он рекурсивен, поэтому отлично справится с вложенными структурами и списками. Я использовал абстрактные базовые классы Mapping и Iterable из коллекций для обработки чего угодно.
Я стремился к почти yaml-подобному выводу с кратким кодом на Python, но не смог.
и некоторые тестовые данные с использованием OrderedDict и списков OrderedDicts ... (чертовски Python так сильно нужны литералы OrderedDict ...)
дает следующий результат:
У меня были некоторые мысли по поводу использования str.format () для лучшего выравнивания, но мне не хотелось вникать в это. Вам нужно будет динамически указывать ширину полей в зависимости от типа выравнивания, которое вы хотите, что может оказаться сложным или громоздким.
Во всяком случае, это показывает мне мои данные в читаемой иерархической форме, так что это работает для меня!
источник
Вот так ^^
или
источник
pprint_od()
функция не работает -for key, item in od
результаты заявления вValueError: too many values to unpack
и единственный выход отступа является окончательной" }"
иkey, item
вprint
необходимости заявления , чтобы быть в круглых скобках. Вот так ^^Я протестировал этот нечестивый взлом на основе обезьяньего патча на python3.5, и он работает:
Вы
pprint
используете обычную сводку на основе dict, а также отключаете сортировку на время вызова, чтобы на самом деле никакие ключи не сортировались для печати.источник
pretty_print.py
как локальный модуль и взломать его (удалитьsorted
вызов или что угодно).Начиная с Python 3.8:
pprint.PrettyPrinter
предоставляетsort_dicts
параметр ключевого слова.По умолчанию True , установка значения False оставит словарь несортированным.
Выведет:
Ссылка: https://docs.python.org/3/library/pprint.html
источник
pprint()
Метод просто вызывая__repr__()
метод вещей в нем, иOrderedDict
не кажется , делать в его методе (или не имеет один или что - то).Вот дешевое решение, которое должно сработать, ЕСЛИ ВАС НЕ ЗАБОТИТСЯ ПОРЯДОК, ВИДИМОЙ В ВЫВОДЕ PPRINT , который может быть большим, если:
Я действительно удивлен, что порядок не соблюдается ... ну ладно.
источник
Вы также можете использовать это упрощение ответа kzh :
Он сохраняет порядок и выводит почти то же, что и ответ webwurst ( печать через json dump ).
источник
Для python <3,8 (например, 3,6):
Обезьяна патч
pprint
«Ssorted
для того , чтобы предотвратить его сортировки. Преимущество этого будет в том, что все работает рекурсивно, и он более подходит, чемjson
вариант для тех, кому нужно использовать, например,width
параметр:Изменить: очистка
Чтобы навести порядок после этого грязного дела, просто запустите:
pprint.sorted = sorted
Для действительно чистого решения можно даже использовать contextmanager:
источник
Вы можете переопределить
pprint()
и перехватить вызовы дляOrderedDict
. Вот простая иллюстрация. Как написано, тоOrderedDict
код переопределения игнорирует любые необязательныеstream
,indent
,width
илиdepth
ключевые слова , которые могут быть пройдены, но может быть расширен для их реализации. К сожалению , этот метод не обрабатывает их в другой контейнер, например , какlist
изOrderDict
-ыхисточник
Если все элементы словаря относятся к одному типу, вы можете использовать замечательную библиотеку обработки данных
pandas
:или
источник