С учетом последней итерации с takewhile (itertools) - PullRequest
2 голосов
/ 28 марта 2019

Мне нужно перебирать CSV, пока логическое значение seguir не станет False. Проблема в том, что takewhile отбрасывает последнюю итерацию, и мне это нужно, так как значения .csv в этой строке относятся к моей проблеме

for line in itertools.takewhile(lambda x: seguir, lectura):

    data3 = strintodate(line[1])
    data4 = strintodate(line[2])
    if data2 < data4:
        seguir = False
    escritura.writerow([programa + 1, data2, data2, line[4]])

Есть предложения? Спасибо

Ответы [ 3 ]

2 голосов
/ 28 марта 2019

Вы можете использовать цикл for с условием, что break s после записи строки взамен:

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 голосов
/ 29 марта 2019
Решение

blhsing - это путь, однако есть еще один способ облысения кошки - используйте itertools.tee, чтобы создать итератор, следующий за

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]])

Одним словом, некрасиво. В некоторой степени можно извлечь, извлекая настройку data2 и других элементов, а также вызов writerow в отдельную функцию

0 голосов
/ 28 марта 2019

Не изменяя много, вы могли бы просто оставить временную переменную вне вашего цикла for, в которой хранится предыдущая строка

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
...