Преобразование кортежей и рекурсивного списка

Рекурсивный список представлен цепочкой пар. Первый элемент каждой пары - это элемент в списке, а второй - пара, представляющая остальную часть списка. Второй элемент последней пары - 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)

Как я могу исправить мой метод, чтобы правильно возвращать вложенный кортеж?

5
задан user1140118 13 February 2012 в 01:41
поделиться