2012-06-12 12 views
10

ho una stringa concatenata come questo:modo più veloce per dividere una stringa concatenata in un tuple e ignorare le stringhe vuote

my_str = 'str1;str2;str3;' 

e vorrei applicare split funzioni ad esso e poi convertire l'elenco portato ad un tuple, e sbarazzarsi di qualsiasi stringa vuota portato dal split (notare l'ultimo ';' alla fine)

Finora, sto facendo questo:

tuple(filter(None, my_str.split(';'))) 

Esiste un modo più efficiente (in termini di velocità e spazio) per farlo?

+0

@Levon, punto preso, mi dispiace, ho appena preso un nome di variabile esempio in fretta. Grazie. – MLister

+1

Spiega cosa intendi esattamente con "migliore". – NPE

+0

1. I segmenti vuoti si possono verificare solo a causa di un ';' alla fine, o potrebbero esserci stringhe vuote nel mezzo della lista? 2. Perché vuoi convertire il risultato in una tupla? Solitamente, semplicemente usando la lista restituita da 'str.split()' dovrebbe andare bene. –

risposta

7

Questo è un modo molto ragionevole per farlo. Alcune alternative:

  • foo.strip(";").split(";") (se non ci saranno fette vuoti all'interno della stringa)
  • [ x.strip() for x in foo.split(";") if x.strip() ] (nell'eliminazione dello spazio da ogni fetta)

Il modo "veloce" per fare questo dipenderà da molte cose ... ma si può facilmente sperimentare di ipython %timeit:

 
In [1]: foo = "1;2;3;4;" 

In [2]: %timeit foo.strip(";").split(";") 
1000000 loops, best of 3: 1.03 us per loop 

In [3]: %timeit filter(None, foo.split(';')) 
1000000 loops, best of 3: 1.55 us per loop 
+0

Se si tratta solo del trailing ';', si può anche usare 'str.rstrip()'. –

+0

Sì, sicuramente. 'strip' li rimuoverà da entrambe le estremità. –

1

uso frazionato e quindi slici ng:

my_str.split(';')[:-1] 

o:

lis=[x for x in my_str.split(';') if x] 
+0

Penso che OP voglia una tupla come risultato, non una lista – Levon

2

Sì, è piuttosto un modo Pythonic per farlo. Se si dispone di un amore per le espressioni del generatore, si potrebbe anche sostituire il filter() con:

tuple(part for part in my_str.split(';') if part) 

Questo ha il vantaggio di consentire l'ulteriore elaborazione su ciascuna parte in linea.

E 'interessante notare che la documentazione per str.split() dice:

... Se sep non viene specificato o è None, qualsiasi stringa spazio bianco è un separatore di e le stringhe vuote vengono rimossi dal risultato .

Mi chiedo perché questo caso particolare è stato fatto, senza che per altri separatori ...

4

Se si prevede una stringa vuota alla fine, si può fare:

a = 'str1;str2;str3;' 
tuple(a.split(';')[:-1]) 

o

tuple(a[:-1].split(';')) 
8

Che ne dici di questo?

tuple(my_str.split(';')[:-1]) 
    ('str1', 'str2', 'str3') 

di dividere la stringa al carattere ;, e passare tutto al largo delle sottostringhe (tranne l'ultima, la stringa vuota) per tupla per creare la tupla risultato.

2

Prova tuple(my_str.split(';')[:-1])

Problemi correlati