简体   繁体   English

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

[英]Most pythonic way to get the previous element

I would like an enumerate -like functional on iterators which yields the pair (previous_element, current_element) . 我希望在迭代器上有类似enumerate的函数,它产生对(previous_element, current_element) That is, given that iter is 也就是说,考虑到iter

i0, i1, i1, ...

I would like offset(iter) to yield 我想offset(iter)屈服

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

What about the simple (obvious) solution? 简单(明显)的解决方案呢?

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

To put more itertools on the table: 把更多的itertool放在桌子上:

from itertools import tee, izip, chain

def tee_zip(iterable):
   a, b = tee(iterable)
   return izip(chain([None], a), b)
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 moved doc string into the function EDIT将doc字符串移动到函数中

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 = this. @bpgergo + @ user792036 =这个。 Best of two worlds :). 最好的两个世界:)。

The best answer I have (and this requires itertools ) is 我有最好的答案(这需要itertools

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

but I would be interested in seeing if someone has a one-liner (or a better name than offset for this function)! 但是我有兴趣看看是否有人有一个单行(或者这个功能的偏移比一个更好的名字)!

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM