Как к структурной распечатке программы вложил словари?

Как может я структурная распечатка программы словарь с глубиной ~4 в Python? Я попробовал симпатичную печать pprint(), но это не работало:

import pprint 
pp = pprint.PrettyPrinter(indent=4)
pp.pprint(mydict)

Я просто хочу добавление отступа ("\t") для каждого вложения, так, чтобы я получил что-то вроде этого:

key1
    value1
    value2
    key2
       value1
       value2

и т.д.

Как я могу сделать это?

242
задан martineau 18 October 2017 в 13:31
поделиться

3 ответа

Я не уверен, как именно вы хотите, чтобы форматирование выглядело, но вы можете начать с такой функцией:

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))
121
ответ дан 23 November 2019 в 03:12
поделиться

Моей первой мыслью было, что сериализатор 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
        }
    }
}
443
ответ дан 23 November 2019 в 03:12
поделиться

Я сам относительный новичок в 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 печатает вложенные словари в удобном формате.

-1
ответ дан 23 November 2019 в 03:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: