Как я могу довольно напечатать словарь с глубиной ~ 4 в Python? Я попытался использовать красивую печать pprint()
, но это не сработало:
import pprint
pp = pprint.PrettyPrinter(indent=4)
pp.pprint(mydict)
Я просто хочу отступ ( "\t"
) для каждого вложения, чтобы получить что-то вроде этого:
key1
value1
value2
key2
value1
value2
и т.п.
Как я могу это сделать?
python
dictionary
Мартино
источник
источник
Ответы:
Я не уверен, как именно вы хотите, чтобы форматирование выглядело, но вы могли бы начать с такой функции:
источник
__future__
этот ответ теперь упоминает, поэтому вы должны использовать их там, где это необходимо (или обновить до 3).python def pretty(d, indent=0): for key, value in d.items(): if isinstance(value, dict): print(' ' * indent + str(key)) pretty(value, indent+1) else: print(' ' * (indent+1) + f"{key}: {value}")
Моей первой мыслью было, что сериализатор JSON, вероятно, довольно хорош во вложенных словарях, поэтому я бы обманул и использовал это:
источник
Вы можете попробовать YAML через PyYAML . Его выход может быть точно настроен. Я бы предложил начать со следующего:
print yaml.dump(data, allow_unicode=True, default_flow_style=False)
Результат очень читабелен; при необходимости его также можно проанализировать обратно в Python.
Редактировать:
Пример:
источник
float
и anumpy.float64
Что касается того, что было сделано, я не вижу симпатичного принтера, который по крайней мере имитирует вывод интерпретатора python с очень простым форматированием, так что вот мой:
Чтобы инициализировать это:
Он может поддерживать добавление форматеров для определенных типов, вам просто нужно создать для этого функцию, подобную этой, и связать ее с нужным вам типом с помощью set_formater:
По историческим причинам я сохранил предыдущий симпатичный принтер, который был функцией вместо класса, но они оба могут использоваться одинаково, версия класса просто позволяет гораздо больше:
Чтобы использовать это:
По сравнению с другими версиями:
источник
таким образом, вы можете распечатать его довольно хорошо, например, ваш словарь зовут Ясин
источник
Еще один вариант с
yapf
:Вывод:
источник
Один из самых питонских способов для этого - использовать уже собранный модуль pprint .
Аргумент, который вам нужен для определения глубины печати, такой, какой вы можете ожидать
depth
Это оно !
источник
Как уже сообщали другие, вы можете использовать recursion / dfs для печати вложенных данных словаря и вызывать рекурсивно, если это словарь; в противном случае распечатайте данные.
источник
pout может напечатать что угодно, например, что вы кидаете (заимствуя
data
из другого ответа):приведет к выводу на экран, например:
или вы можете вернуть форматированную строку вывода вашего объекта:
Его основной сценарий использования предназначен для отладки, поэтому он не перекрывает экземпляры объектов или что-либо еще и обрабатывает вывод в кодировке Unicode, как и следовало ожидать, работает в python 2.7 и 3.
Раскрытие : я автор и сопровождающий.
источник
Я взял ответ sth и слегка изменил его, чтобы он соответствовал моим потребностям во вложенных словарях и списках:
Который затем дает мне вывод, как:
источник
Sth, я тону, это красиво;)
источник
list
значения, которые не являютсяdict
экземплярами, т.е.pretty({'key': [1, 2, 3]}, indent=4)
==>AttributeError: 'int' object has no attribute 'iteritems'
. Мне тоже не нравятся прописные клавиши.источник
Я написал этот простой код для печати общей структуры объекта json в Python.
результат для следующих данных
очень компактен и выглядит так:
источник
Я сам относительный новичок в Python, но последние пару недель я работал с вложенными словарями, и это то, что я придумал.
Вы должны попробовать использовать стек. Сделайте ключи из корневого словаря в список списка:
Идя в обратном порядке от последнего к первому, ищите каждый ключ в словаре, чтобы увидеть, является ли его значение (также) словарем. Если нет, распечатайте ключ и удалите его. Однако , если значение ключа является словарь, напечатайте ключ, затем добавьте ключи для этого значения в конец стека и начните обрабатывать этот список таким же образом, повторяя рекурсивно для каждого нового списка ключей.
Если бы значение для второго ключа в каждом списке было словарем, у вас было бы что-то вроде этого после нескольких раундов:
Преимущество этого подхода в том, что отступ равен
\t
длине стека:Недостатком является то, что для проверки каждого ключа вам нужно хешировать до соответствующего под-словаря, хотя это можно легко сделать с помощью понимания списка и простого
for
цикла:Имейте в виду, что этот подход потребует очистки конечных пустых списков, и удаления последнего ключа в любом списке, за которым следует пустой список (что, конечно, может создать другой пустой список и т. Д.).
Есть и другие способы реализации этого подхода, но, надеюсь, это даст вам базовое представление о том, как это сделать.
РЕДАКТИРОВАТЬ: Если вы не хотите проходить через все это,
pprint
модуль печатает вложенные словари в хорошем формате.источник
Вот функция, которую я написал на основе комментариев. Он работает так же, как json.dumps с отступом, но я использую вкладки вместо места для отступов. В Python 3.2+ вы можете указывать отступ как '\ t' напрямую, но не в 2.7.
Пример:
источник
Вот кое-что, что напечатает любой вложенный словарь, отслеживая при этом «родительские» словари.
Это хорошая отправная точка для печати в соответствии с различными форматами, например, указанными в OP. Все, что вам действительно нужно, это операции с блоками Print . Обратите внимание, что он проверяет, является ли значение OrderedDict (). В зависимости от того, используете ли вы что-либо из коллекций типов данных контейнера , вы должны сделать этот тип безопасных сейфов, чтобы блок elif не видел его в качестве дополнительного словаря из-за его имени. На данный момент пример словаря, как
распечатает
~ изменение кода в соответствии с форматом вопроса ~
Используя тот же пример кода, он напечатает следующее:
Это не совсем то , что запрашивается в OP. Разница в том, что родительский ^ n по-прежнему печатается, а не отсутствует и заменяется пробелом. Чтобы перейти к формату OP, вам нужно сделать что-то вроде следующего: итеративно сравнить dicList с lastDict . Вы можете сделать это, создав новый словарь и скопировав в него содержимое dicList, проверив, совпадает ли i в скопированном словаре с i в lastDict, и - если это так - записывает пробелы в эту позицию i с помощью функции умножения строк. ,
источник
По этой ссылке :
источник
Я просто возвращаюсь к этому вопросу после того, как взял ответ от sh и сделал небольшую, но очень полезную модификацию. Эта функция печатает все ключи в дереве JSON, а также размер листовых узлов в этом дереве.
Это действительно хорошо, когда у вас есть большие объекты JSON и вы хотите выяснить, где находится мясо. пример :
Это скажет вам, что большая часть данных, о которых вы заботитесь, вероятно, находится внутри,
JSON_object['key1']['key2']['value2']
потому что длина этого значения, отформатированного в виде строки, очень велика.источник
Используйте эту функцию:
Назовите это так:
источник
Вот что я придумал, работая над классом, который должен был написать словарь в .txt файле:
Теперь, если у нас есть такой словарь:
И мы делаем:
Мы получили:
источник