python 3 : Checking next value of an iterator without iterating

标签 python csv python-3.x for-loop iterator

对于一个项目,如果下一行的某一列中的值等于当前行的同一列中的值,我需要 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 项成对出现。

关于 python 3 : Checking next value of an iterator without iterating,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32160272/

相关文章:

amazon-web-services - AWS 雅典娜。无法使用 CSV list 作为位置

javascript - 如何将名称添加到未命名的 JSON 对象数组中?

python - 从 python 中的 SVG 源在 GTK3 中绘制 SVG 图像

python - moviepy 调整大小在某些尺寸下不起作用

Python:从列表列表中删除元组

php - 获取数组 - 在 CSV 中合并一些结果

Python; urllib 错误 : AttributeError: 'bytes' object has no attribute 'read'

python - 打印链表队列中的元素

python - 在字典中创建嵌套列表,列表中没有重复项