我希望在迭代器上有一个enumerate
函数,它产生对(previous_element, current_element)
。也就是说,假设iter
是
i0, i1, i1, ...
我希望offset(iter)
能够产生
(None, i0), (i0, i1), (i1, i2) ...
答案 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)
但是我有兴趣看看有人是否有一个单行(或者这个函数的偏移名称比偏移更好)!