10

enumerateペアを生成するイテレータのような関数が必要(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)

EDITはドキュメント文字列を関数に移動しました

于 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 = これ。2つの世界のベスト:)。

于 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 に答える