Как может я структурная распечатка программы словарь с глубиной ~4 в Python? Я попробовал симпатичную печать pprint()
, но это не работало:
import pprint
pp = pprint.PrettyPrinter(indent=4)
pp.pprint(mydict)
Я просто хочу добавление отступа ("\t"
) для каждого вложения, так, чтобы я получил что-то вроде этого:
key1
value1
value2
key2
value1
value2
и т.д.
Как я могу сделать это?
Я не уверен, как именно вы хотите, чтобы форматирование выглядело, но вы можете начать с такой функцией:
def pretty(d, indent=0):
for key, value in d.items():
print('\t' * indent + str(key))
if isinstance(value, dict):
pretty(value, indent+1)
else:
print('\t' * (indent+1) + str(value))
Моей первой мыслью было, что сериализатор JSON, вероятно, довольно хорош для вложенных словарей, так что я бы схитрил и использовал это:
>>> import json
>>> print json.dumps({'a':2, 'b':{'x':3, 'y':{'t1': 4, 't2':5}}},
... sort_keys=True, indent=4)
{
"a": 2,
"b": {
"x": 3,
"y": {
"t1": 4,
"t2": 5
}
}
}
Я сам относительный новичок в Python, но последние пару недель я работал с вложенными словарями, и это то, что я придумал.
Вам следует попробовать использовать стек. Превратите ключи из корневого словаря в список списка:
stack = [ root.keys() ] # Result: [ [root keys] ]
Двигаясь в обратном порядке от последнего к первому, найдите каждый ключ в словаре, чтобы увидеть, является ли его значение (также) словарем. Если нет, распечатайте ключ и удалите его.Однако, если значением ключа является словарь, распечатайте ключ, затем добавьте ключи для этого значения в конец стека и начните обработку этого списка таким же образом, повторяя рекурсивно для каждого нового списка. ключей.
Если бы значением для второго ключа в каждом списке был словарь, вы бы получили что-то вроде этого после нескольких раундов:
[['key 1','key 2'],['key 2.1','key 2.2'],['key 2.2.1','key 2.2.2'],[`etc.`]]
Положительная сторона этого подхода состоит в том, что отступ в \ t
раз больше длина стека:
indent = "\t" * len(stack)
Обратной стороной является то, что для проверки каждого ключа вам необходимо выполнить хеширование до соответствующего вложенного словаря, хотя с этим легко справиться с помощью понимания списка и простого для
loop:
path = [li[-1] for li in stack]
# The last key of every list of keys in the stack
sub = root
for p in path:
sub = sub[p]
if type(sub) == dict:
stack.append(sub.keys()) # And so on
Имейте в виду, что этот подход потребует от вас очистки завершающих пустых списков, и , чтобы удалить последний ключ в любом списке, за которым следует пустой список (который, конечно, может создать еще один пустой список и скоро).
Есть и другие способы реализации этого подхода, но, надеюсь, это даст вам общее представление о том, как это сделать.
РЕДАКТИРОВАТЬ: Если вы не хотите повторять все это, модуль pprint
печатает вложенные словари в удобном формате.