2009-12-20 7 views
3

J'essaie de trouver du code qui, étant donné une chaîne, me permettra d'itérer sur chaque ligne en utilisant la construction for loop, mais avec l'exigence que séparé pour les constructions de boucle ne réinitialise pas l'itération au début.Comment faire une itération sur une chaîne en utilisant un tampon (python)

Au moment j'ai

sList = [line for line in theString.split(os.linesep)] 
for line in SList 
    ... do stuff 

Mais successives pour les boucles réinitialisera l'itération retour au début.

Est-ce que quelque chose existe en python, ou devrais-je en écrire une de toutes pièces?

+0

Pouvez-vous clarifier un peu avec quelques exemples? Avez-vous par exemple Vous voulez rompre la boucle avant d'avoir parcouru tout et de savoir où vous êtes? ! –

+0

#/usr/bin/env/usr/bin/python import os theString = "abc \ ndef" sList = [ligne pour la ligne à theString.split (os.linesep)] pour la ligne à sList: ligne d'impression break pour la ligne à sList: ligne d'impression break si imprimer: abc def Non abc abc – Taras

Répondre

2

Utilisez un autre iterator:

aList = range(10) 
anIterator = iter(aList) 

for item in anIterator: 
    print item 
    if item > 4: break 

for item in anIterator: 
    print item 
0

Essayez d'utiliser une combinaison de tranches et enumerate():

sList = theString.split(os.linesep) 
for i, line in enumerate(sList): 
    if foo: 
     break 

for j, line in enumerate(sList[i:]): 
    # do more stuff 
+0

Cela rompre avec un NameError si 'sList' est vide. – lenz

13

Il suffit d'utiliser une expression du générateur (Genexp) au lieu de la compréhension de la liste (listcomp) vous êtes maintenant en utilisant - à savoir:

sList = (line for line in theString.split(os.linesep)) 

c'est tout - si vous êtes par ailleurs satisfait de votre code (fractionnement par os.linesep, même si les E/S de texte normales en Python les ont déjà traduites en \n ...), tout ce que vous avez à faire est d'utiliser parenthèses (le type rond) au lieu de parenthèse s (le type carré), et vous obtiendrez un générateur au lieu d'une liste.

Maintenant, chaque fois que vous faites un for line in sList:, il recommencera à partir de l'endroit où le précédent s'est arrêté (vraisemblablement à cause d'un break) - c'est ce que vous demandez, n'est-ce pas?

+0

Ah, bien fait, monsieur. Merci de m'avoir appris quelque chose sur les nouvelles fonctionnalités de python. –

+0

Quelle version de python a été introduite par genexp? Nous utilisons 2,2 pour le moment, et j'obtiens une erreur de syntaxe en utilisant votre suggestion. – Taras

+0

@Taras, ils sont arrivés avec 2.4, il y a un peu plus de 5 ans. Un appel explicite à 'iter', comme dans la réponse de Federico que vous avez suggérée, fonctionne en 2.2. (Si vous avez besoin d'aide sur une version qui a 5 versions et 5 ans de retard, l'indiquer dans vos questions sera beaucoup plus utile que de le mentionner tardivement dans les commentaires ;-). –

0

Pirater un itérateur? Ensuite, appelez simplement iterOverList() dans une boucle plusieurs fois, il conservera l'état?

+0

's/yeild/yield /' – ndim

+0

Oops brainfart./merci – richo

+0

Espérait qu'il y avait un moyen plus simple! On dirait qu'il y a, voir @Federico ci-dessous – Taras

Questions connexes