2012-02-13 18 views
5

Una lista recursiva está representada por una cadena de pares. El primer elemento de cada par es un elemento en la lista, mientras que el segundo es un par que representa el resto de la lista. El segundo elemento del par final es Ninguno, lo que indica que la lista ha finalizado. Podemos construir esta estructura usando un literal de tupla anidado. Ejemplo:Tupla y conversión de lista recursiva

(1, (2, (3, (4, Ninguno))))

Hasta ahora, he creado un método que conversos una tupla de valores o el valor Ninguno en una lista correspondiente. El método se llama a_rlist (elementos). Ejemplo:

>>> to_rlist((1, (0, 2),(), 3)) 
(1, ((0, (2, None)), (None, (3, None)))) 

¿Cómo se escribe la inversa de to_rlist, una función que toma un RLIST como entrada y devuelve la tupla correspondiente? El método debe llamarse a_tuple (parámetro). Ejemplo de lo que debería suceder:

>>> x = to_rlist((1, (0, 2),(), 3)) 
>>> to_tuple(x) 
(1, (0, 2),(), 3) 

Nota: El método to_rlist funciona según lo previsto.

Esto es lo que tengo hasta ahora:

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) 

Lo que me da el resultado siguiente (lo cual es incorrecto):

>>> x = to_rlist((1, (0, 2),(), 3)) 
>>> to_tuple(x) 
(1, 0, 2,(), 3) 

¿Cómo puedo arreglar mi método para devolver una tupla anidada correctamente ?

+1

una lista recursiva es la que contiene una referencia a sí mismo. – wim

+2

@wim También podría significar "un tipo de lista definido en términos de sí mismo" en cuyo caso cabría. (También es probable que sea el término que usa la tarea, otra razón por la que puede permanecer). – millimoose

+5

@ user1140118: Stack Overflow no es un sitio de "hacer (partes de) mi tarea para mí". Debe comenzar la función por su cuenta y publicar preguntas sobre problemas * específicos * que tenga. – millimoose

Respuesta

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. use 'x is None' para realizar comparaciones contra singleton 2. use' isinstance' para verificaciones de tipos, de modo que el código aún funcione con clases heredadas 3. cuando vea la etiqueta 'homework', no solo publique una solución . ayudar al estudiante a determinar qué área necesita mejorar en su propio trabajo. – wim

+0

Intenté con la solución pero solo puedo concatenar tupla (no "str") para tuplar ¿qué es lo que está mal? – Dejell

-1

Éste trabajó para mi 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

¿Qué es empty_rlist y qué es make_rlist? – Dejell