2
votes

Prise en compte de la dernière itération avec take while (itertools)

Je dois parcourir le .csv jusqu'à ce que le booléen appelé "seguir" devienne False. Le problème est que take while supprime la dernière itération et les dernières valeurs, et j'en ai besoin car les valeurs du .csv de cette ligne sont pertinentes pour mon problème.

for line in itertools.takewhile(lambda x: seguir, lectura):
    data2 = strintodate(line[1])
    data4 = strintodate(line[2])
    if data2 < data4:
        seguir = False
    escritura.writerow([programa + 1, data2, data2, line[4]])

Des suggestions? Merci


0 commentaires

4 Réponses :


0
votes

Sans changer grand-chose, vous pourriez simplement conserver une variable temporaire en dehors de votre boucle for qui stocke la ligne précédente

prevLine = ""
for line in itertools.takewhile(lambda x: seguir, lectura):
    <check that prevLine is not empty string as it will be on first iteration>
    <do oepration involving prevLine>
    data3 = strintodate(line[1])
    data4 = strintodate(line[2])
    if data2 < data4:
        seguir = False
    escritura.writerow([programa + 1, data2, data2, line[4]])
    prevLine = line


0 commentaires

2
votes

Vous pouvez utiliser une boucle for avec une condition qui casser s après l'écriture de la ligne à la place:

for line in lectura:
    data3 = strintodate(line[1])
    data4 = strintodate(line[2])
    escritura.writerow([programa + 1, data2, data2, line[4]])
    if data2 < data4:
        break


0 commentaires

0
votes

La solution de blhsing est la voie à suivre, mais il existe une autre façon de dépecer le chat - utilisez itertools. tee pour créer un itérateur qui suit de près

iter1, iter2 = tee(lectura)
for line in itertools.takewhile(lambda x: seguir, iter1):
    next(iter2)
    data3 = strintodate(line[1])
    data4 = strintodate(line[2])
    if data2 < data4:
        seguir = False
    escritura.writerow([programa + 1, data2, data2, line[4]])
line = next(iter2)
data3 = strintodate(line[1])
data4 = strintodate(line[2])
escritura.writerow([programa + 1, data2, data2, line[4]])

En un mot, moche. Un peu récupérable en extrayant le paramètre de data2 et d'autres éléments ainsi que l'appel à writerow dans une fonction distincte


0 commentaires

1
votes

Une autre solution plus élégante à ce problème est de changer le moment où vous évaluez data2 : si vous faites cela dans le prédicat du take while () , cela vous permettra d'inclure la "dernière" itération dans votre traitement. En d'autres termes, si vous avez 5 lignes avec data2 et la sixième ligne avec data2> = data4 , la boucle pour ci-dessous sera exécuter 6 fois, la dernière fois vous permettant de conserver les valeurs.

Le code devient comme ceci:

data2, data4 = 2, 4
for line in itertools.takewhile(lambda x: data2 < data4, lectura):
    data2 = strintodate(line[1])
    data4 = strintodate(line[2])
    escritura.writerow([programa + 1, data2, data2, line[4]])


0 commentaires