/ / Перетворення з кортежу кортежів до вкладених кортежів у Python - python, алгоритм, python-3.x, рекурсія, структури даних

Перетворення з кортежу набору у вставлені кортежі в Python - python, алгоритм, python-3.x, рекурсія, структури даних

Чи є простий спосіб перетворення

t = ((1,), (1, 2), (1, 2, 3), (1, 2, 3, 4), (1, 2, 3, 4, 5))

до наступної рекурсивної структури, де кожен наступний кортеж додається як елемент попереднього кортежу

(1, (1, 2, (1, 2, 3, (1, 2, 3, 4, (1, 2, 3, 4, 5)))))

Яка межа цього гніздування? Чи можу я мати 1000 або 10000 таких вкладених кортежів?

ОНОВЛЕННЯ: Здається t Вкладеність необмежена (спробували з 10000 після встановлення ліміту рекурсії до 100).

У вікні 7, Python 3.5) границя рекурсії спочатку становить близько 300, але її можна скасувати як (довідка). Це не пов'язано зі структурою t, але може бути пов'язано з рутинною роботою Python, що має доступ до вкладених рівнів отриманої структури.

sys.getrecursionlimit()   # display current recursion level
sys.setrecursionlimit(10000)  # set recursion level to 1000

Відповіді:

0 для відповіді № 1

Ви могли б зробити

def convert(t):
result = t[-1]
for x in t[-2::-1]:
result = x + (result,)
return result

який переходить назад t. Можливо, ви можете побудувати дуже глибоко вкладений кортеж, але у вас може виникнути проблема з його роздруком.


6 для відповіді № 2

Використовуючи functools.reduce:

>>> from functools import reduce
>>> t = ((1,), (1, 2), (1, 2, 3), (1, 2, 3, 4), (1, 2, 3, 4, 5))
>>> reduce(lambda a, b: b + (a,), reversed(t), ())
(1, (1, 2, (1, 2, 3, (1, 2, 3, 4, (1, 2, 3, 4, 5)))))

0 для відповіді № 3

Для вкладеної конструкції:

def f(t):
res = t[-1]
for x in t[-2::-1]:
res = x + (res,)
return res

t = ((1,), (1, 2), (1, 2, 3), (1, 2, 3, 4), (1, 2, 3, 4, 5))
print f(t)

за те, наскільки велика вона може бути, я не знаю, але я припускаю, що це залежить від вашої машини, ваших налаштувань і так далі ...