10

我想enumerate在迭代器上使用类似函数,它会产生 pair (previous_element, current_element)。也就是说,鉴于这iter

i0, i1, i1, ...

我愿意offset(iter)屈服

(None, i0), (i0, i1), (i1, i2) ...
4

5 回答 5

26

简单(明显)的解决方案呢?

def offset(iterable):
    prev = None
    for elem in iterable:
        yield prev, elem
        prev = elem
于 2012-08-22T15:22:05.920 回答
8

将更多的 itertools 放在桌面上:

from itertools import tee, izip, chain

def tee_zip(iterable):
   a, b = tee(iterable)
   return izip(chain([None], a), b)
于 2012-08-22T15:24:17.443 回答
2
def pairwise(iterable):
    """s -> (s0,s1), (s1,s2), (s2, s3), ...
    see http://docs.python.org/library/itertools.html
    """
    a, b = itertools.tee(iterable)
    b.next()
    return itertools.izip(a, b)

编辑将文档字符串移动到函数中

于 2012-08-22T15:19:08.900 回答
1
def offset(iter, n=1, pad=None):
    i1, i2 = itertools.tee(iter)
    i1_padded = itertools.chain(itertools.repeat(pad, n), i1)
    return itertools.izip(i1_padded, i2)

@bpgergo + @user792036 = 这个。两全其美:)。

于 2012-08-22T15:26:18.993 回答
0

我拥有的最佳答案(这需要itertools)是

def offset(iter, n=1):
    # returns tuples (None, iter0), (iter0, iter1), (iter1, iter2) ...
    previous = chain([None] * n, iter)
    return izip(previous, iter)

但我很想看看是否有人有一个单行(或者比这个函数的偏移更好的名字)!

于 2012-08-22T15:18:31.130 回答