2012-11-22 5 views
5

Sto provando a dividere un percorso dato come stringa in sotto-parti usando "/" come delimitatore in modo ricorsivo e passato in una tupla. Ad esempio: "E:/John/2012/practice/question11" dovrebbe essere ('E:', 'John', '2012', 'practice', 'question11').Python Split path in modo ricorsivo

Quindi ho passato ogni carattere escludendo il "/" in una tupla ma non è come volevo il giunto delle parti secondarie come mostrato nell'esempio. Questa è una domanda pratica nei compiti a casa e apprezzerebbe l'aiuto mentre sto cercando di imparare la ricorsione.

Grazie mille

risposta

10

Qualcosa di simile

>>> import os 
>>> s = "E:/John/2012/practice/question11" 
>>> os.path.split(s) 
('E:/John/2012/practice', 'question11') 

Avviso os.path.split() non contempla l'intero percorso come str.split() farebbe

>>> def rec_split(s): 
...  rest, tail = os.path.split(s) 
...  if rest == '': 
...   return tail, 
...  return rec_split(rest) + (tail,) 
... 
>>> rec_split(s) 
('E:', 'John', '2012', 'practice', 'question11') 

Edit: Anche se la domanda era sui percorsi di Windows. È abbastanza semplice modificarlo per percorsi unix/linux compresi quelli che iniziano con "/"

>>> def rec_split(s): 
...  rest, tail = os.path.split(s) 
...  if rest in ('', os.path.sep): 
...   return tail, 
...  return rec_split(rest) + (tail,) 
+2

Questa soluzione è migliore perché è indipendente dal sistema operativo e non prevede alcuna ipotesi sull'utilizzo di barre o barre rovesciate. – DaveP

+0

Questo non funziona per i percorsi che iniziano con '/'. – asmeurer

+0

Questo non funziona in Linux, poiché "resto" diventa "/". Purtroppo non ho ancora abbastanza reputazione per votare questo, quindi questo commento. :( Sto usando questo ora: ' def rec_split (percorso): elementi = [] while ((path = '/') e (path = '')!!): percorso, coda = os.path.split (percorso) elements.insert (0, tail) elementi di ritorno ' –

2

vostro errore non è in ricorsione, ma piuttosto quello che stai facendo per concatenare i risultati ricorsive. Supponiamo che tu abbia raggiunto ('E:', 'John', '2012', 'prac') e che il carattere successivo sia 't'; non si desidera aggiungere 't' al risultato ricorsivo, si desidera accodarlo all'ultimo word del risultato ricorsivo. Allo stesso modo, quando si raggiunge un separatore, si desidera inizializzare la nuova parola come vuota.

Quando esegui la ricorsione, avrai (quasi) sempre due casi: uno ricorsivo e uno terminale. Di solito il terminale è facile e lo hai fatto correttamente (se non c'è nessuna stringa, non ci sono parole). Ma trovo che aiuti immensamente se provi ad avere un esempio specifico del caso ricorsivo, da qualche parte nel mid-computation come sopra, per capire esattamente cosa deve accadere.

+0

Potrebbe farmi un esempio, per favore? Non capisco come si va ad aggiungerlo all'ultima parola quando lo si fa in modo ricorsivo. – user1757703

+0

Non voglio risolvere i tuoi compiti per te, dovresti comunque lavorare per questo. Ma puoi aggiungere una lettera all'ultimo elemento di una tupla con 'percorso = ultimo percorso [: - 1] + (ultimo percorso [-1] + s [0],)'. – Amadan