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)