滚动或在Python滑动窗口迭代器 [英] Rolling or sliding window iterator in Python
本文介绍了滚动或在Python滑动窗口迭代器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我需要一个滚动窗口(又名滑动窗口)可迭代的一个序列/迭代器/发电机。默认的Python迭代可以被认为是一种特殊情况,这里的窗口长度为1。我目前使用下面的code。有没有人有一个更Python,更简洁,更有效的方法这样做?
高清rolling_window(SEQ,WINDOW_SIZE):
IT =国际热核实验堆(SEQ)
赢= [it.next()的CNT在的xrange(WINDOW_SIZE)]#第一窗口
产量取胜
为电子商务在它:#后续的窗口
赢[: - 1] =夺冠[1:]
赢[-1] = E
产量取胜
如果__name __ ==__ main__:
为瓦特在rolling_window(的xrange(6),3):
打印传单W
输出示例:
[0,1,2]
[1,2,3]
[2,3,4]
[3,4,5]
解决方案
还有一个在旧版本的Python文档用的 itertools
范例:
从itertools进口islice
高清窗口(序列中,n = 2):
返回一个滑动窗(宽度为n的)在从可迭代数据
秒 - >(S0,S1,... S [N-1]),(S1,S2,...,SN),...
IT =国际热核实验堆(SEQ)
结果=元组(islice(IT,N))
如果len(结果)== N:
产量结果
对于ELEM它:
结果=结果[1:] +(ELEM,)
产量结果
从文档的一个是多了几分简洁,使用 itertools
来更好的效果我想象的。
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]
"""
解决方案
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
The one from the docs is a little more succinct and uses itertools
to greater effect I imagine.
这篇关于滚动或在Python滑动窗口迭代器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文