Python循环:惯用地比较lis中的连续项

2024-09-30 12:17:21 发布

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

我需要遍历一个对象列表,像这样比较它们:0与1、1与2、2与3,等等(我使用pysvn提取一个diff列表)。最后我只循环了一个索引,但我一直想知道是否有某种方法更符合习惯用法。它是Python;我不应该以某种聪明的方式使用迭代器吗?简单地循环索引似乎很清楚,但我想知道是否有更具表现力或更简洁的方法来完成它。在

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

Tags: 对象方法in列表for方式svndiff
3条回答

我可能会:

import itertools
for rev1, rev2 in zip(dm_revisions, itertools.islice(dm_revisions, 1, None)):
    summary = svn.diff_sumeraize(svn_python, revision1=rev, revision2=rev2)

类似的更聪明的方法,并且不接触迭代器本身,也可以使用

发布了这么多复杂的解决方案,为什么不保持简单呢?在

myList = range(5)

for idx, item1 in enumerate(myList[:-1]):
    item2 = L[idx + 1]
    print item1, item2

>>> 
0 1
1 2
2 3
3 4

这叫做滑动窗。有一个example in the ^{} documentation可以做到。代码如下:

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

什么,你可以这样说:

^{pr2}$

当然,你只关心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)

相关问题 更多 >

    热门问题