2016-12-31 11 views
1

У меня есть программа, которая генерирует следующий список кортежей:Преобразование списка кортежей в глубокий вложенный список

[('Government and politics', 2), ('Government', 3), ('Capital punishment', 4), ('Federal representation', 4), ('Politics', 3)] 

Если число отражает иерархию. Мне было интересно, если существует рекурсивный способ преобразования этого списка кортежей в вложенный список следующим образом:

['Government and politics', ['Government', ['Capital punishment', 'Federal representation'], 'Politics']] 
+0

Почему бы не изменить исходную программу для создания того, что вам нужно? – jtbandes

+0

Это часть более крупного кода, целью которого является копирование заголовков (h1, h2, ...) статей Википедии. Существующие API Википедии предоставляют плоский список этих заголовков. То, что у меня есть, настолько далеко, насколько я мог бы заставить его походить на иерархическую структуру. – Alshafai

+0

Хорошо. Почему вы хотите использовать рекурсию? Вы пробовали простой цикл? – jtbandes

ответ

2

Это не обязательно использовать рекурсию в этом случае:

def nest(data, base=0): 
    result = [] 
    for item, level in data: 
     target = result 
     for depth in range(base, level): 
      if not (len(target) > 0 and isinstance(target[-1], list)): 
       target.append([]) 
      target = target[-1] 
     target.append(item) 
    return result 

Внешняя петля эта функция выполняет итерацию по парам item, level в ваших данных, а внутренний цикл сводится к соответствующей глубине, создавая новые под-списки по мере необходимости.

Аргумент base - это минимальный уровень в ваших данных, в данном случае 2. Здесь в действии:

>>> data = [ 
...  ('Government and politics', 2), 
...  ('Government', 3), 
...  ('Capital punishment', 4), 
...  ('Federal representation', 4), 
...  ('Politics', 3) 
... ] 

>>> nest(data, 2) 
['Government and politics', ['Government', ['Capital punishment', 'Federal representation'], 'Politics']]