Python循环:以惯用方式比较列表中的连续项

All*_*son 6 python iterator loops

我需要循环一个对象列表,比较它们是这样的:0对1,1对2,2对3等等(我正在使用pysvn来提取差异列表.)我结束了循环索引,但我一直想知道是否有某种方法可以做到更贴近惯用.这是Python; 我不应该以某种聪明的方式使用迭代器吗?简单地循环索引似乎很清楚,但我想知道是否有更具表现力或简洁的方法来做到这一点.

for revindex in xrange(len(dm_revisions) - 1):
    summary = \
        svn.diff_summarize(svn_path,
                          revision1=dm_revisions[revindex],
                          revision2 = dm_revisions[revindex+1])
Run Code Online (Sandbox Code Playgroud)

Jas*_*rff 13

这称为滑动窗口.文档中有一个例子itertools可以做到这一点.这是代码:

from itertools import islice

def window(seq, n=2):
    "Returns a sliding window (of width n) over data from the iterable"
    "   s -> (s0,s1,...s[n-1]), (s1,s2,...,sn), ...                   "
    it = iter(seq)
    result = tuple(islice(it, n))
    if len(result) == n:
        yield result    
    for elem in it:
        result = result[1:] + (elem,)
        yield result
Run Code Online (Sandbox Code Playgroud)

那是什么,你可以这样说:

for r1, r2 in window(dm_revisions):
    summary = svn.diff_summarize(svn_path, revision1=r1, revision2=r2)
Run Code Online (Sandbox Code Playgroud)

当然你只关心n = 2的情况,所以你可以更简单地得到一些东西:

def adjacent_pairs(seq):
    it = iter(seq)
    a = it.next()
    for b in it:
        yield a, b
        a = b

for r1, r2 in adjacent_pairs(dm_revisions):
    summary = svn.diff_summarize(svn_path, revision1=r1, revision2=r2)
Run Code Online (Sandbox Code Playgroud)