Рекурсивный список представлен цепочкой пар. Первый элемент каждой пары является элементом списка, а второй - парой, представляющей остальную часть списка. Вторым элементом последней пары является None, который указывает, что список закончился. Мы можем построить эту структуру, используя вложенный литерал кортежа. Пример:
(1, (2, (3, (4, нет))))
Пока что я создал метод, который преобразует кортеж значений или значение 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)
Как я могу исправить свой метод для правильного возврата вложенного кортежа?