2013-09-26 3 views
3

Я пытался получить решение из моего прежнего вопроса до запуска here, но, к сожалению, без успеха. Я сейчас пытаюсь изменить код, чтобы доставить мне результат, а не идентификаторы, но сами значения «имя». JSON это мой json, я хочу извлечь SUB, SUBSUB и NAME, а при использовании квази для цепочки я не вернусь в иерархию, чтобы получить SUBSUB2 ... Может ли кто-нибудь, пожалуйста, поставить меня как-то на правильный путь?Извлечь имена объектов с разных уровней вложенности в JSON

Код раствор из первого вопроса:

def locateByName(e,name): 
    if e.get('name',None) == name: 
     return e 

    for child in e.get('children',[]): 
     result = locateByName(child,name) 
     if result is not None: 
      return result 

    return None 

То, что я точно хочу, чтобы достичь является простой список, как SUB1, SUBSUB1, NAME1, NAME2, SUBSUB2 и т.д ...

ответ

3

Предполагая x является ваш JSON,

def trav(node, acc = []): 
    acc += [node['name']] 
    if 'children' in node: 
     for child in node['children']: 
      trav(child, acc) 

acc = [] 
trav(x, acc) 
print acc 

Выход:

['MAIN', 'SUB1', 'SUBSUB1', 'NAME1', 'NAME2', 'SUBSUB2', 'SUBSUB3'] 

Другой, более компактное решение:

from itertools import chain   

def trav(node): 
    if 'children' in node: 
     return [node['name']] + list(chain.from_iterable([trav(child) for child in node['children']])) 
    else: 
     return [node['name']] 

print trav(x) 
+0

Спасибо большое, это прекрасно. И это то, что на Stackoverflow лучше всего - возможность учиться, я не знал об этом itertools lib. :) – jakkolwiek

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