Python3:不迭代检查迭代器的下一个值

2024-04-25 06:41:07 发布

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

对于一个项目,如果下一行的某一列中的值等于当前行的同一列中的值,我需要签入一个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)我进入循环;row=row1 (2) 当前行=行1,下一行=行2 (3) 我进入循环的下一个迭代;row=row3,因为我使用了__next__()。当前行=第3行,下一行=第4行

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

是否可以在不迭代迭代器对象的情况下检查下一行的值? 或者,是否存在与__next__()相反的方法,使迭代器返回一步?在

请注意:我正在比较当前值与下一个而不是当前值与上一个值,因为我不知道我正在读的文件有多长。我必须将文件的最后一行与其他行不同,因此我必须检查reader.__next()__以查看是否有最后一行。在


Tags: 文件csvpath项目标题字典valuecolumn
3条回答

试试itertoolspairwise配方。一个更一般的解决方案是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。在

^{pr2}$

请注意,如果您有一个iterable,其中有n项,那么将有n-1项成对出现。在

我不知道这是否可行,但它在android上有效

reader = csv.DictReader(f, dialect='excel')
  reader2 = csv.DictReader(f, dialect='excel')

  for row in reader:
    current_row = row

        for row2 in reader2
          next_row = reader2.__next__()
          if current_row[column] == next_row[column]:
          dosomething()
          continue

您的需求和内置迭代器的思想相冲突。所以我建议您将循环封装在自定义迭代器中。 其思想是从原始迭代器中生成两个值,对于最后一行的下一个值没有值。在

相关问题 更多 >