2017-10-01 17 views
1
from collections import deque 

def window(seq, n=2): 
    it = iter(seq) 
    win = deque((next(it, None) for _ in xrange(n)), maxlen=n) 
    yield win 
    append = win.append 
    for e in it: 
     append(e) 
     yield win 

a=[1,2,3] 
b=[2,4,6] 


for d in zip(window(a,2),window(b,2)): 
    print d 
    raw_input("Press Enter to continue...") 

出力:は、STそれぞれは、その状態の残業を変更し、同じアイテムを返し

(deque([2, 3], maxlen=2), deque([4, 6], maxlen=2)) 
Press Enter to continue... 
(deque([2, 3], maxlen=2), deque([4, 6], maxlen=2)) 
Press Enter to continue... 

何イムすべてキャプチャするために、ここで行うことですしよう

(deque([1, 2], maxlen=2), deque([2, 4], maxlen=2)) 
Press Enter to continue... 
(deque([2, 3], maxlen=2), deque([4, 6], maxlen=2)) 
Press Enter to continue... 
:つまり abの長さ2の窓は、出力は次のようになることを期待イムzip形式

明らかに、windowは、私がここに何が起こるかを推測、それだけが保持しているアイテムの変化に何度も何度も同じオブジェクトを得ているが、反復がImは同じ2デックを取得するので、開始する前にzipが反復可能を作成していることですオブジェクトは2回圧縮されますが、問題はそれらを最終状態にすることです。

ウィンドウ機能でコピーを作成しなくても、それを修正することをどのように提案しますか?

返すために窓を変え例えばコピーは動作します:

def window(seq, n=2): 
    it = iter(seq) 
    win = deque((next(it, None) for _ in xrange(n)), maxlen=n) 
    yield list(win) 
    append = win.append 
    for e in it: 
     append(e) 
     yield list(win) 

は、しかし、私のユースケースAとBの中で、あまり効率的で巨大かつ反復が非効率的である前にすべてのそれらのコピーをziping ...

されています
+1

(try python3 :-)) – PRMoureu

+0

@PRMoureuそれは動作します...しかし、Python 2の解決策はありますか? –

答えて

2

はPython2で、ループを開始前に2回の反復可能オブジェクトをビュン 使用itertools.izipの代わりzipを避けるために:

import itertools as IT 
import collections 

def window(seq, n=2): 
    it = iter(seq) 
    win = collections.deque((next(it, None) for _ in range(n)), maxlen=n) 
    yield win 
    append = win.append 
    for e in it: 
     append(e) 
     yield win 

a=[1,2,3] 
b=[2,4,6] 

for d in IT.izip(window(a,2),window(b,2)): 
    print(d) 

は(Python2でitertools.izipと同じ)イテレータを返すzip、のpython3で

[deque([1, 2], maxlen=2), deque([2, 4], maxlen=2)] 
[deque([2, 3], maxlen=2), deque([4, 6], maxlen=2)] 

をもたらします。これはあなたが投稿したコードがPython3で変更なしですでに動作する理由です。

関連する問題