Преобразование кортежей и списков - PullRequest
4 голосов
/ 13 февраля 2012

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

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

Ответы [ 2 ]

4 голосов
/ 13 февраля 2012
def to_list(x):
    if x == None:
        return ()
    if type(x) != tuple:
        return x
    a, b = x
    return (to_list(a),) + to_list(b)
0 голосов
/ 13 февраля 2012

Этот работал для моего HW;)

def to_rlist(items):
    r = empty_rlist
    for i in items[::-1]:
        if is_tuple(i): r1 = to_rlist(i)
        else: r1 = i
        r = make_rlist(r1,r)
    return r
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...