2013-09-29 3 views
0

У меня есть словарь питона, состоящий из других словарей, как так (пример):ДИКТ из dicts питона

{2: {4: {5: {6: {7: None}}}, 7: None}, 7: None} 

Я хотел бы, чтобы извлечь ключи, так что я в конечном итоге с:

[2,4,5,6,7,None] 
[2,7,None] 
[7,None] 

Я попытался решить эту проблему с помощью рекурсивной функции, однако, не повезло ...

def f(d): 
    paths = [] 
    try: 
     for key in f.keys(): 
      path.append(f(d[key])) 
    pass: 
     pass 

есть ли способ сделать это ап d как?

+0

Я не понимаю, как вы получите ваш ожидаемый результат. Не могли бы вы объяснить? – TerryA

+0

Рекурсия не помогает, если вы просто отбрасываете промежуточный результат (т. Е. «Пути») в подвыборы. –

ответ

1

Следующая, кажется, сделать трюк:

def f(d): 
    paths = [] 
    for key, value in d.items(): 
     if value is None: 
      paths.append([key, value]) 
     else: 
      internal_lists = f(value) 
      for l in internal_lists: 
       paths.append([key] + l) 
    return paths 

1) Ваша попытка: петля плохо написано: синтаксис

try: 
    xxx 
except: 
    xxx 

И вы ожидаете неудачу здесь? Почему попытка?

2) Ваш цикл не может быть прав ни:

for key in f.keys(): 

е является функцией, она не имеет ключей. d делает.

3) При работе с ключом, вы должны держать его где-то на выходе, и вы не на данный момент

+0

Спасибо! прекрасно работает. Вы правы в пункте 1), 2) и 3), спасибо за комментарии! – Anders

+1

Он будет выглядеть намного лучше, чем генератор: https://gist.github.com/eallik/6752160 :) ** ОБНОВЛЕНИЕ: ** в Python 3, 'yield from' делает его еще приятнее. –

+0

Спасибо @ ErikAllik, очень чистый, я буду смотреть на это (я использую 2,7 битв.) – Anders

Смежные вопросы