2017-02-09 9 views
3
def windows(iterable,n,m=1): 
    x = iter(iterable) 
    l = [] 
    y = next(x) 
    for i in range(n): 
     l.append(y) 
     y = next(x) 
    yield l 

    while x: 
     for i in range(m): 
      l.pop(0) 
     for i in range(m): 
      l.append(y) 
      y = next(x) 
     yield l 

Windowsジェネレータを書くには、iterableと2つのint(nとmをmのデフォルト値1と呼ぶ)をパラメータとして書く必要があります。 n値:最初のリストに最初のn値が含まれます。後続のリストはすべて、前のリストから最初のmを削除し、返されたリストに入れる値がn個未満になるまで、繰り返し可能なものから次のm個の値を追加します。例えばステップmで長さnの繰り返し可能なスライディングウィンドウを生成する

for i in windows('abcdefghijk', 4,2): 
    print(i,end='') 

プリント['a','b','c','d'] ['c','d','e','f'] ['e','f','g','h'] ['g','h','i','j']

私は私が問題を把握することはできません

[['i', 'j', 'k'], ['i', 'j', 'k'], ['i', 'j', 'k'], ['i', 'j', 'k']] 

私のコードを印刷、上記の関数を呼び出します。誰か私はそれを修正するために助けることができますか?前もって感謝します。

+1

1つのライナーで、私が試したいくつかのケースのために働くように見えます。それらをすべて保存して、一度にすべて印刷すると(生成されたそれぞれの印刷ではなく)、明らかに同じ内容がすべて印刷されます。それぞれのステップでリストのコピーを作るために '' yield l [:] ''を試してください。 – jasonharper

+0

'['i'、 'j'、 'k']'の返りを避けるために、おそらく 'len(l)== n:yield l [:]'も欲しいでしょう。 –

答えて

1

nアイテムを取得するにはスライシングを使用し、開始値はm増加する必要があります。

def windows(iterable, n, m = 1): 
    if m == 0: # otherwise infinte loop 
     raise ValueError("Parameter 'm' can't be 0") 
    lst = list(iterable) 
    i = 0 
    while i + n < len(lst): 
     yield lst[i:i + n] 
     i += m 

# Output 
>>> for i in windows('abcdefghijk', 4, 2): 
    print(i) 

['a', 'b', 'c', 'd'] 
['c', 'd', 'e', 'f'] 
['e', 'f', 'g', 'h'] 
['g', 'h', 'i', 'j'] 
+0

無限ループの 'm' == 0に関する良いキャッチです。おそらく 'ValueError'を投げることは、その特定のエッジケースと戦うより良い方法かもしれません。 –

+0

@PaulRooneyありがとうございます。「ValueError」が適切です。 –

1

おそらく、あなたが遅延イテラブルで作業していないと仮定して、このようなことがあります。

def windows(iterable, n, m=1): 
    length = len(iterable) 
    i = 0 

    while i + n < length: 
     yield list(iterable[i:i + n]) 
     i += m 

for win in windows('abcdefghijk', 4, 2): 
    print(win) 

出力

​​
0

は、発電機自体はあなたが同じリストオブジェクトを毎回得ている

def WindGen(astr, n, m = 1): 
    if m !=0: 
     return (list(astr[i * m : i * m + n]) for i in range((len(astr) - n) // m + 1))  

astr = 'abcdefghijk' 
n, m = 4, 2 
print(*WindGen(astr, n, m), sep='\n') 
['a', 'b', 'c', 'd'] 
['c', 'd', 'e', 'f'] 
['e', 'f', 'g', 'h'] 
['g', 'h', 'i', 'j'] 
関連する問題