2012-02-13 2 views
5

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

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

+1

Рекурсивный список один, который содержит ссылку на себя. – wim

+2

@wim Это также может означать «тип списка, определенный в терминах самого себя», и в этом случае он будет соответствовать. (Это также, вероятно, термин, используемый назначением, другая причина, по которой он может остаться.) – millimoose

+5

@ user1140118: Stack Overflow не является «участником моей домашней работы для меня». Вы должны начать работу над функцией самостоятельно и задавать вопросы о * конкретных * проблемах, которые у вас есть. – millimoose

ответ

4
def to_list(x): 
    if x == None: 
     return() 
    if type(x) != tuple: 
     return x 
    a, b = x 
    return (to_list(a),) + to_list(b) 
+3

1. используйте 'x is None' для сравнения с singleton 2. используйте' isinstance' для проверок типов, чтобы код по-прежнему работал с унаследованными классами 3. когда вы видите тег 'homework', не просто отправляйте решение , помогите студенту определить, в какой области нуждается в улучшении в своей работе. – wim

+0

Я пробовал решение, но могу только конкатенировать кортеж (а не «str»), чтобы кормить, что не так? – Dejell

-1

Это один работал на моем 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 
+5

Что такое empty_rlist и что такое make_rlist? – Dejell

Смежные вопросы