Рекурсивный список представлен цепочкой пар. Первый элемент каждой пары - это элемент в списке, а второй - пара, представляющая остальную часть списка. Второй элемент последней пары - None, что указывает на то, что список закончился. Мы можем построить эту структуру, используя литерал вложенного кортежа. Пример:
(1, (2, (3, (4, None))))
До сих пор я создал метод, который преобразует кортеж значений или значение None в соответствующий rlist. Метод называется to_rlist (items). Пример:
>>> to_rlist((1, (0, 2), (), 3))
(1, ((0, (2, None)), (None, (3, None))))
Как мне написать функцию, обратную to_rlist, которая принимает на вход rlist и возвращает соответствующий кортеж? Метод должен называться to_tuple (параметр). Пример того, что должно произойти:
>>> x = to_rlist((1, (0, 2), (), 3))
>>> to_tuple(x)
(1, (0, 2), (), 3)
Примечание: метод to_rlist работает должным образом.
Вот что у меня есть на данный момент:
def to_tuple(L):
if not could_be_rlist(L):
return (L,)
x, y = L
if not x is None and not type(x) is tuple and y is None:
return (x,)
elif x is None and not y is None:
return ((),) + to_tuple(y)
elif not x is None and not y is None:
return to_tuple(x) + to_tuple(y)
Это дает мне следующий результат (который неверен):
>>> x = to_rlist((1, (0, 2), (), 3))
>>> to_tuple(x)
(1, 0, 2, (), 3)
Как я могу исправить мой метод, чтобы правильно возвращать вложенный кортеж?