Как os.walk глубокий defaultdict для значений? - PullRequest
0 голосов
/ 30 июля 2010

У меня очень большой defaultdict (dict), который выглядит примерно так:

 data['w']['x']['y']['z']={'a':5,'b':10}

Я пытаюсь создать отчет, в котором перечислена иерархия всех ключей, по которым перемещался конкретный конечный словарь.Другими словами, я ищу его «полный путь», как если бы последний словарь был файлом, а родительский путь был ключом, используемым для поиска этого конкретного словаря.В этом случае в отчете будет следующая строка:

 w:x:y:z:a=5:b=10

Мне нравится использовать defaultdict, но одной из проблем является извлечение материала из глубоко вложенного defaultdict (dict).

Любая помощь приветствуется.

1 Ответ

1 голос
/ 30 июля 2010

Если возможно, просто сгладьте путь:

data['w:x:y:z'] = {'a':5, 'b':10}

for path, d in data.items():
    print '%s:%s' % (path, ':'.join("%s=%r" % pair for pair in d.items()))

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

for w, wvals in data.items():
    for x, xvals in wvals.items():
        for y, yvals in xvals.items():
            for z, zvals in yvals.items():
                print '%s:%s:%s:%s:%s' % (
                    w, x, y, z,
                    ':'.join("%s=%r" % pair for pair in d.items()))

В противном случае вы должны прибегнуть к рекурсии.

def dump(data, path=''):
    if isinstance(data, defaultdict):
        for k, v in data.items():
            dump(v, path + k + ":")
    else:
        print "%s%s" % (path, ':'.join("%s=%r" % pair for pair in d.items()))

dump(data)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...