Skip to main content
 首页 » 编程设计

python 3 : Checking next value of an iterator without iterating

2025年05月04日12TianFang

对于一个项目,如果下一行的某一列中的值等于当前行的同一列中的值,我需要 checkin 一个 csv 文件。我正在使用字典 csv 阅读器,即阅读器中的每一行都是一个字典文件。我可以使用列标题作为键来访问特定行的值:row[header] = value。

我当前代码的精简版本如下所示:

import csv 
 
with open(os.path.abspath(path_to_file), "r") as f: 
    reader = csv.DictReader(f, dialect='excel') 
 
    for row in reader: 
        current_row = row 
        next_row = reader.__next__() 
        if current_row[column] == next_row[column]: 
            dosomething() 

这里的问题当然是我使用 __next__() 跳过下一次迭代,即

(1) 我进入循环;行 = 行 1 (2) current_row = row1, next_row = row2 (3) 我进入循环的下一次迭代; row = row3 因为我使用了 __next__()。 current_row = row3, next_row = row4

在这个例子中,我永远不会检查 row2 == row3。

是否可以在不遍历迭代器对象的情况下检查下一行的值? 或者,是否有与 __next__() 相反的方法,它使迭代器后退一步?

请注意:我将当前值与下一个值而不是当前值进行比较到 last 值,因为我不知道我正在阅读的文件有多长。我必须将文件的最后一行与其他行区别对待,所以无论如何我都必须检查 reader.__next()__ 以查看是否有最后一行。

请您参考如下方法:

试试 itertools pairwise 方法。一个更通用的解决方案是 tee 你的迭代器(这是成对配方使用的)。另一种可能性是创建一个函数,该函数具有 cur 和 next 变量并产生您想要的值(基本上是 pairwise 所做的,但您可以使它产生 CSV 中的字段而不是整行)。

来自 https://docs.python.org/2/library/itertools.html

def pairwise(iterable): 
     "s -> (s0,s1), (s1,s2), (s2, s3), ..." 
    a, b = tee(iterable) 
    next(b, None) 
    return izip(a, b) 

我认为 pairwise 可以做你在这里需要的一切,所以不要对你自己的生成器函数或 tee 大惊小怪。

reader = csv.DictReader(f, dialect='excel') 
 
for current_row, next_row in pairwise(reader): 
    if current_row[column] == next_row[column]: 
        dosomething() 

请注意,如果您有一个包含 n 项的可迭代对象,那么将有 n-1 项成对出现。