小编典典

滚动或滑动窗口迭代器?

algorithm

我需要在序列/迭代器/生成器上可迭代的滚动窗口(又称滑动窗口)。可以将默认Python迭代视为一种特殊情况,其中窗口长度为1。我当前正在使用以下代码。有没有人有更多的Python风格,更少的冗长或更有效的方法来执行此操作?

def rolling_window(seq, window_size):
    it = iter(seq)
    win = [it.next() for cnt in xrange(window_size)] # First window
    yield win
    for e in it: # Subsequent windows
        win[:-1] = win[1:]
        win[-1] = e
        yield win

if __name__=="__main__":
    for w in rolling_window(xrange(6), 3):
        print w

"""Example output:

   [0, 1, 2]
   [1, 2, 3]
   [2, 3, 4]
   [3, 4, 5]
"""

阅读 311

收藏
2020-07-28

共1个答案

小编典典

Python文档的旧版本中有一个带有itertools示例

from itertools import islice

def window(seq, n=2):
    "Returns a sliding window (of width n) over data from the iterable"
    "   s -> (s0,s1,...s[n-1]), (s1,s2,...,sn), ...                   "
    it = iter(seq)
    result = tuple(islice(it, n))
    if len(result) == n:
        yield result
    for elem in it:
        result = result[1:] + (elem,)
        yield result

文档中的一个更加简洁,itertools我想它可以起到更大的作用。

2020-07-28