2013-03-18 4 views
0

У меня есть список словаря, как показано ниже:как сделать словарь из данного списка словаря

targer = [ 
    {"id":1,"search":"xyz"}, 
    {"id":2,"children":[ 
     {"id":3,"search":'xyz'}, 
     {"id":4,"search":'xyz'}, 
     {"id":5,"children":[ 
      {"id":6,"search":'xyz'}, 
      {"id":7,"search":'xyz'}, 
      {"id":8,"search":'xyz'}]}, 
     {"id":9,"search":'xyz'}, 
     {"id":10,"search":'xyz'}]}, 
    {"id":11},{"id":12}] 

Теперь я хочу, чтобы сделать список словаря, как показано ниже в целевом списке:

output = [ 
    {'tier1': 1, 'searchterm': 'xyz'}, 
    {'tier1': 2, 'tier2': 3,'searchterm': 'xyz'}, 
    {'tier1': 2,'tier2': 4,'searchterm': 'xyz'}, 
    {'tier1': 2, 'tier2': 5,'tier3': 6,'searchterm': 'xyz'}, 
    {'tier1': 2, 'tier2': 5,'tier3': 7,'searchterm': 'xyz'}, 
    {'tier1': 2, 'tier2': 5,'tier3': 8, 'searchterm': 'xyz'}, 
    {'tier1': 2, 'tier2': 9,'searchterm': 'xyz'}, 
    {'tier1': 2, 'tier2': 10,'searchterm': 'xyz'}, 
    {'tier1': 11, 'searchterm': 'xyz'}, 
    {'tier1': 12, 'searchterm': 'xyz'}] 

Я попробовал несколько шагов: 1.First я преобразовать целевой список, чтобы список, как показано ниже:

mylist = [ 
    [1, 'xyz'], 
    [2, 3, 'xyz'], 
    [2, 4, 'xyz'], 
    [2, 5, 6, 'xyz'], 
    [2, 5, 7, 'xyz'], 
    [2, 5, 8, 'xyz'], 
    [2, 9, 'xyz'], 
    [2, 10, 'xyz'], 
    [11], 
    [12]] 

2.Then я применил ниже код на MyList, чтобы получить выход:

for i in lis: 
dic={} 


length=len(i) 
if length==2: 

    dic['tier1']=i[0] 
    dic['searchterm']=i[1] 

if length==3: 
    dic['tier1']=i[0] 
    dic['tier2']=i[1] 
    dic['searchterm']=i[2] 

if length==4: 
    dic['tier1']=i[0] 
    dic['tier2']=i[1] 
    dic['tier3']=i[2] 
    dic['searchterm']=i[3] 

if length==5: 
    dic['tier1']=i[0] 
    dic['tier2']=i[1] 
    dic['tier3']=i[2] 
    dic['tier4']=i[3] 
    dic['searchterm']=i[4] 

if length==6: 
    dic['tier1']=i[0] 
    dic['tier2']=i[1] 
    dic['tier3']=i[2] 
    dic['tier4']=i[3] 
    dic['tier5']=i[4] 
    dic['searchterm']=i[5] 

target.append(dic) 

Но я хочу, чтобы вывести из прямого целевого списка с применением из выше шагов. Пожалуйста, помогите решить эту проблему.

+4

Подсказка: Попробуйте рекурсию –

+0

Почему 'searchterm' значение' Tier1: 11' и 'Уровень1: 12' "хуг"? В исходной структуре данных эти словари не имеют клавиш поиска. –

ответ

1

рекурсивный генератор будет делать трюк:

def flatten(list_of_dicts, tier = 1, prev = {}): 

    for item in list_of_dicts: 
     curr = prev.copy() 
     curr['tier%d' %tier] = item['id'] 
     if 'children' in item: 
      for next in flatten(item['children'], tier + 1, curr): 
       yield next 
     else: 
      if 'search' in item: #some items don't have it 
       curr['searchterm'] = item['search'] 
      yield curr 


>>> list(flatten(targer)) 
[{'tier1': 1, 'searchterm': 'xyz'}, {'tier1': 2, 'searchterm': 'xyz', 'tier2': 3}, {'tier1': 2, 'searchterm': 'xyz', 'tier2': 4}, {'tier1': 2, 'searchterm': 'xyz', 'tier3': 6, 'tier2': 5}, {'tier1': 2, 'searchterm': 'xyz', 'tier3': 7, 'tier2': 5}, {'tier1': 2, 'searchterm': 'xyz', 'tier3': 8, 'tier2': 5}, {'tier1': 2, 'searchterm': 'xyz', 'tier2': 9}, {'tier1': 2, 'searchterm': 'xyz', 'tier2': 10}, {'tier1': 11}, {'tier1': 12}] 
Смежные вопросы