2012-06-15 22 views
7

Dada una cuerda muy grande. Me gustaría procesar partes de la cadena en un bucle como este:Equivalente para cuerdas pop

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

¿Cuál es una manera agradable y eficiente de hacerlo?

+4

¿Qué es exactamente lo que quieres? Los primeros 200 caracteres? ¿El personaje número 200? ¿Algo más? –

+1

@KarlKnechtel ¿El ciclo while no muestra claramente que quiero procesar todos los caracteres de la cadena? –

+1

Parece que desea eliminar y procesar el carácter número 200 de large_string hasta que aparezca "IndexError: pop index fuera de rango" –

Respuesta

14

se puede envolver la cuerda en un StringIO o BytesIO y pretende ser un archivo. Eso debería ser bastante rápido.

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

Batirme por 6 segundos. – mgilson

+0

Si quiere consumir la cadena desde el final, esto no funciona. – schlamar

+0

@ ms4py Afortunadamente, el orden de los fragmentos no importa en absoluto para mi tarea –

6

puede convertir la cadena en una lista. list(string) y el pop, o se puede repetir en trozos cortando la lista [] o Usted puede cortar la cadena como es y iterar en trozos

3

Usted puede hacer esto con slicing:

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

Esto es bastante inútil. No solo porque hace el corte dos veces, sino porque usa un algoritmo de tiempo O (n²). –