2012-06-15 13 views
7

Data una stringa molto grande. Vorrei elaborare parti della stringa in un ciclo come questo:Equivalente per le stringhe di stringhe

large_string = "foobar..." 
while large_string: 
    process(large_string.pop(200)) 

Che è un modo bello ed efficiente di fare questo?

+4

Che cosa vuoi esattamente? I primi 200 personaggi? Il 200 ° personaggio? Qualcos'altro? –

+1

@KarlKnechtel Il ciclo while non indica chiaramente che desidero elaborare tutti i caratteri della stringa? –

+1

Sembra che tu voglia rimuovere ed elaborare il 200esimo carattere di large_string finché pop non lancia "IndexError: pop index out of range" –

risposta

14

si può avvolgere la stringa in un StringIO o BytesIO e fai finta che sia un file. Dovrebbe essere piuttosto veloce.

from cStringIO import StringIO 
# or, in Py3/Py2.6+: 
#from io import BytesIO, StringIO 

s = StringIO(large_string) 
while True: 
    chunk = s.read(200) 
    if len(chunk) > 0: 
     process(chunk) 
    if len(chunk) < 200: 
     break 
+2

Sconfiggilo di 6 secondi. – mgilson

+0

Se vuole consumare la stringa dalla fine, questo non funziona. – schlamar

+0

@ ms4py fortunatamente l'ordine dei blocchi non ha alcuna importanza per il mio compito –

6

è possibile convertire la stringa in un elenco. list(string) e pop, o si potrebbe iterare in blocchi di tagliare la lista [] oppure si può affettare la stringa come è e iterare in blocchi

3

Si può fare questo con slicing:

large_string = "foobar..." 
while large_string: 
    process(large_string[-200:]) 
    large_string = large_string[:-200] 
+3

Questo è piuttosto dispendioso. Non solo perché esegue l'affettatura due volte, ma perché utilizza un algoritmo di tempo O (n²). –

Problemi correlati