Ci sono due punti principali da considerare qui:
- aspettavo il risultato di
'/segment/segment/'.split('/')
essere pari a ['segment', 'segment']
è ragionevole, ma allora questo perde informazioni. Se split()
ha funzionato come volevi, se ti dico che è a.split('/') == ['segment', 'segment']
, non puoi dirmi che cosa era a
.
- Quale dovrebbe essere il risultato di
'a//b'.split()
essere? ['a', 'b']
? O ['a', '', 'b']
? I.e, dovrebbe split()
unire i delimitatori adiacenti? Se dovesse essere così, sarà molto difficile analizzare i dati delimitati da un personaggio, e alcuni campi potrebbero essere vuoti. Sono abbastanza sicuro che ci sono molte persone che do vogliono i valori vuoti nel risultato per il caso precedente!
Alla fine, tutto si riduce a due cose:
Consistenza: se ho n
delimitatori, in a
, ottengo n+1
valori indietro dopo la split()
.
Dovrebbe essere possibile fare cose complesse, e facile da fare le cose semplici: se si desidera ignorare le stringhe vuote a causa della split()
, si può sempre fare:
def mysplit(s, delim=None):
return [x for x in s.split(delim) if x]
ma se uno doesn 't voglio ignorare i valori vuoti, uno dovrebbe essere in grado di.
Il linguaggio deve scegliere una definizione di split()
— ci sono troppi casi d'uso diversi per soddisfare il requisito di tutti come predefinito. Penso che la scelta di Python sia buona, ed è la più logica. (Per inciso, uno dei motivi che non mi piacciono di C strtok()
è perché si fonde delimitatori adiacenti, rendendo estremamente difficile fare gravi parsing/tokenizzazione con esso.)
C'è una sola eccezione: a.split()
senza un argomento stringe lo spazio bianco consecutivo, ma si può sostenere che questa è la cosa giusta da fare in quel caso. Se non vuoi il comportamento, puoi sempre a a.split(' ')
.
fonte
2010-02-04 05:44:24
Ho la stessa domanda e cercato per lungo tempo. Ora capisco che i risultati vuoti sono davvero importanti. Grazie per la tua domanda. – Emerald214
Una soluzione è usare 'strip()' per rimuovere i caratteri di divisione e di coda della stringa prima della divisione: ''/ segment/segment /'. Strip ('/'). Split ('/')' – pkamb