滚动或在Python滑动窗口迭代器 [英] Rolling or sliding window iterator in Python

查看:2564
本文介绍了滚动或在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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆