2011-07-26 11 views
8

est-il un moyen pythonique (je sais que je peux boucle en utilisant plage (len (..)) et obtenir un indice) pour faire l'exemple suivant:pour les boucles 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 

essentiellement, le tout niché La boucle devrait incrémenter la boucle for.

Edit: Pas un descripteur de fichier, a confondu deux choses que je travaillais, il y a une liste de chaînes

+3

Utilisez line.startswith et line.endswith au lieu des lignes [0] et [-1]. Cela fonctionne bien avec les lignes vides. Et a aussi l'air mieux :). – utdemir

+0

@utdemir: l'esprit soufflé, j'avais fait tant de contrôles pour 'len (ligne)> 0' – pseudosudo

Répondre

9

L'un des défis les plus fondamentaux de python est de devenir intelligent en itérant sur list s et dict s. Si vous avez réellement besoin de modifier la collection lors de l'itération, vous devrez peut-être travailler sur une copie ou stocker les modifications à appliquer à la fin de l'itération.

Dans votre cas, il vous suffit d'ignorer les éléments de la liste. Vous pouvez probablement gérer cela en développant l'itération dans une forme plus explicite.

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 # 

et c'est tout ce que vous avez vraiment besoin de faire. Editer: Comme le mentionne tout à l'heure, si la partie while peut itérer après la fin de la séquence d'entrée, vous devrez en faire un peu plus. Vous pouvez faire ce qui suit.

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()' déclenche 'StopIteration' (car, disons, la dernière ligne de la liste se termine par un octothorpe), elle ne sera pas interceptée par' for'. Vous devrez l'attraper séparément. – kindall

+0

@kindall: hmm. On dirait que tu as peut-être raison. Fixé – SingleNegationElimination

5

Tant que file est un descripteur de fichier, vous pouvez le faire au lieu d'utiliser readlines():

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

Les poignées de fichier sont itérables et la fonction next() récupère la valeur suivante à partir d'une itérable.

+0

ah désolé, mélangé deux problèmes différents, ce n'est pas une poignée de fichier – pseudosudo

+1

Je pense que g.d.d.c répond toujours à votre question. utilisez next() pour ajuster votre itérateur –

+1

le chaînon manquant est que si 'list_of_strings' est itérable, alors' fh = iter (list_of_strings) 'est nécessaire avant la boucle for. Il arrive que 'file's sont leurs propres itérateurs, bien que' list's ne le soient pas. – SingleNegationElimination