本文介绍了滚动或滑动窗口迭代器?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我需要在序列/迭代器/生成器上可迭代的滚动窗口(又称滑动窗口)。默认的Python迭代可以视为一种特殊情况,窗口长度为1。我目前正在使用以下代码。有没有人有更Pythonic,更简单或更有效的方法来做到这一点?
I need a rolling window (aka sliding window) iterable over a sequence/iterator/generator. Default Python iteration can be considered a special case, where the window length is 1. I'm currently using the following code. Does anyone have a more Pythonic, less verbose, or more efficient method for doing this?
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]
"""
推荐答案
老版本的Python文档中有一个带有:
There's one in an old version of the Python docs with itertools
examples:
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
产生更大的效果。
The one from the docs is a little more succinct and uses itertools
to greater effect I imagine.
这篇关于滚动或滑动窗口迭代器?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!