2012-06-15 2 views
7

Angesichts einer sehr großen Zeichenfolge. Ich mag Teile der Zeichenfolge in einer Schleife wie folgt verarbeiten:Entspricht für Pop on Strings

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

Was ist eine schöne und effiziente Art und Weise, dies zu tun?

+4

Was genau wollen Sie? Die ersten 200 Zeichen? Der 200. Charakter? Etwas anderes? –

+1

@KarlKnechtel Zeigt die while-Schleife nicht eindeutig, dass ich alle Zeichen der Zeichenfolge verarbeiten möchte? –

+1

Es sieht so aus, als ob Sie das 200ste Zeichen von large_string entfernen und verarbeiten wollen, bis Pop "IndexError: pop index out of range" auslöst. –

Antwort

14

Sie die Zeichenfolge wickeln können in einer StringIO oder BytesIO und so tun, als sei es eine Datei. Das sollte ziemlich schnell sein.

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

Beat mich um 6 Sekunden. – mgilson

+0

Wenn er die Zeichenfolge vom Ende verbrauchen möchte, funktioniert das nicht. – schlamar

+0

@ ms4py ist die Reihenfolge der Chunks für meine Aufgabe glücklicherweise egal –

6

Sie können die Zeichenfolge in eine Liste konvertieren. list(string) und Pop es, oder man könnte in Stücke laufen die Liste Aufschneiden [] oder Sie können die Zeichenfolge in Scheiben schneiden wie und iterieren in chunks

3

Sie können dies mit slicing:

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

Das ist ziemlich verschwenderisch. Nicht nur, weil es das Slicing zweimal durchführt, sondern weil es einen O (n²) -Zeitalgorithmus verwendet. –