2011-07-26 9 views
8

¿Hay alguna manera Pythonic (Sé que puedo bucle que utiliza rango (len (..)) y obtener un índice) para hacer el siguiente ejemplo:de bucles en Python

for line in list_of_strings: 
    if line[0] == '$': 
     while line[-1] == '#': 
      # read in the Next line and do stuff 
     # after quitting out of the while loop, the next iteration of the for loop 
     # should not get any of the lines that the while loop already dealt with 

esencialmente, al mismo tiempo anidado loop debería estar incrementando el ciclo for.

Editar: No es un identificador de archivo, confundido dos cosas las que estaba trabajando, que es una lista de cadenas

+3

Use line.startswith y line.endswith en lugar de línea [0] y línea [-1]. Funciona bien con líneas vacías. Y también se ve mejor :). – utdemir

+0

@utdemir: alucinado, he estado haciendo tantos controles para 'len (línea)> 0' – pseudosudo

Respuesta

9

Uno de los desafíos más básicos en python es volverse inteligente al iterar sobre list sy dict s. Si realmente necesita modificar la colección mientras itera, puede necesitar trabajar en una copia, o almacenar los cambios para aplicar al final de la iteración.

En su caso, solo necesita omitir elementos de la lista. Probablemente pueda gestionar esto expandiendo la iteración a una forma más explícita.

i = iter(list_of_strings) 
for line in i: 
    if line.startswith('$'): 
     while line.endswith('#'): 
      line = i.next() 
     # do work on 'line' which begins with $ and doesn't end with # 

y eso es todo lo que realmente necesita hacer.

Editar: Como dice kindall, si la porción while puede iterar más allá del final de la secuencia de entrada, tendrá que hacer un poco más. Puedes hacer lo siguiente.

i = iter(list_of_strings) 
for line in i: 
    if line[0] == '$': 
     try: 
      while line[-1] == '#': 
       line = i.next() 
     except StopIteration: 
      break 
     # do work on 'line' which begins with $ and doesn't end with # 
+0

si 'i.next()' levanta 'StopIteration' (porque, por ejemplo, la última línea de la lista termina con un octothorpe) no será capturada por' for'. Tendrás que atraparlo por separado. – kindall

+0

@kindall: hmm. Parece que tienes razón. Fijo – SingleNegationElimination

5

Mientras file es un identificador de archivo se puede hacer esto en lugar de utilizar readlines():

for line in fh: 
    if line[0] == '$': 
    while line[-1] == '#': 
     line = next(fh) 

Los identificadores de archivo son iterables, y la función next() recupera el siguiente valor de un iterable.

+0

ah, disculpe, mezclé dos problemas diferentes, no es un identificador de archivo – pseudosudo

+1

Creo que g.d.d.c aún responde a su pregunta. use next() para ajustar su iterador –

+1

el eslabón perdido es que si 'list_of_strings' es iterable, entonces' fh = iter (list_of_strings) 'es necesario antes del ciclo for. Sucede que 'file's son sus propios iteradores, aunque' list's no lo son. – SingleNegationElimination