2012-02-13 12 views
5

Una lista ricorsiva è rappresentata da una catena di coppie. Il primo elemento di ogni coppia è un elemento nella lista, mentre il secondo è una coppia che rappresenta il resto della lista. Il secondo elemento della coppia finale è Nessuno, che indica che l'elenco è terminato. Possiamo costruire questa struttura usando un tuple letterale annidato. Esempio:Conversione tupla e lista ricorsiva

(1, (2, (3, (4, None))))

Finora, ho creato un metodo che converte una tupla di valori o il valore None in una rlist corrispondente. Il metodo è chiamato to_rlist (items). Esempio:

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

Come faccio a scrivere l'inverso di to_rlist, una funzione che prende un rlist come input e restituisce la relativa tupla? Il metodo dovrebbe essere chiamato to_tuple (parametro). Esempio di cosa dovrebbe accadere:

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

Nota: il metodo to_rlist funziona come previsto.

Questo è quello che ho finora:

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) 

che mi dà il seguente risultato (che non è corretto):

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

Come posso risolvere il mio metodo per restituire una tupla nidificato correttamente ?

+1

un elenco ricorsivo è uno che contiene un riferimento a se stessa. – wim

+2

@wim Potrebbe anche significare "un tipo di lista definito in termini di se stesso" nel qual caso sarebbe adatto. (Probabilmente è anche il termine utilizzato dall'assegnazione, un'altra ragione per cui può rimanere.) – millimoose

+5

@ user1140118: Stack Overflow non è un sito "fai (parti di) i miei compiti per me". Dovresti iniziare da solo sulla funzione e pubblicare domande su * specifici * problemi che stai riscontrando. – millimoose

risposta

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. usa 'x è None' per i confronti contro singleton 2. usa' isinstance' per i controlli di tipo, in modo che il codice funzioni ancora con le classi ereditate 3. quando vedi il tag 'homework', non limitarti a pubblicare una soluzione . aiutare lo studente a capire quale area ha bisogno di miglioramento nel proprio lavoro. – wim

+0

Ho provato la soluzione ma posso concatenare solo tupla (non "str") per tupla cosa non va? – Dejell

-1

Questo ha funzionato per il mio 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

Che cos'è empty_rlist e che cos'è make_rlist? – Dejell