大多数pythonic方式获得前一个元素

时间:2012-08-22 15:16:09

标签: python iterator

我希望在迭代器上有一个enumerate函数,它产生对(previous_element, current_element)。也就是说,假设iter

i0, i1, i1, ...

我希望offset(iter)能够产生

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

5 个答案:

答案 0 :(得分:26)

简单(明显)解决方案怎么样?

def offset(iterable):
    prev = None
    for elem in iterable:
        yield prev, elem
        prev = elem

答案 1 :(得分:8)

将更多的itertools放在桌面上:

from itertools import tee, izip, chain

def tee_zip(iterable):
   a, b = tee(iterable)
   return izip(chain([None], a), b)

答案 2 :(得分: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)

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

答案 3 :(得分: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 =这个。最好的两个世界:)。

答案 4 :(得分:0)

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

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

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