考虑到takewhile(itertools)的最后一次迭代

2024-07-08 10:44:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要遍历.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]])

有什么建议吗? 谢谢


Tags: csvlambdainfalseforiflineitertools
3条回答

可以使用for循环,条件是在写入行后breaks:

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

在不做太多更改的情况下,您是否可以将一个temp变量保留在存储前一行的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

blhsing's解决方案是可行的,但是还有一种方法可以剥猫皮—使用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的调用提取到一个单独的函数中,这是可以挽救的

相关问题 更多 >

    热门问题