I\'m trying to generate a sliding window function in Python. I figured out how to do it but not all inside the function. itertools, yield, and iter() are entirely new to me
def window(fseq,fn):
alpha=[fseq[i:i+fn] for i in range(len(fseq)-(fn-1))]
return alpha
Use zip function in one line code:
[ "".join(j) for j in zip(*[fseq[i:] for i in range(window_size)])]
I don't know what your input or expected output are, but you cannot mix yield
and return
in one function. change return
to yield
and your function will not throw that error again.
def window(fseq, window_size=5):
....
final.append(tentative_string)
yield final
>>>def window(data, win_size):
... tmp = [iter(data[i:]) for i in range(win_size)]
... return zip(*tmp)
>>> a = [1, 2, 3, 4, 5, 6]
>>> window(a, 3)
>>>[(1,2,3), (2,3,4), (3,4,5), (4,5,6)]
You mean you want to do this ? :
a='abcdefg'
b = [a[i:i+3] for i in xrange(len(a)-2)]
print b
['abc', 'bcd', 'cde', 'def', 'efg']
Your generator could be much shorter:
def window(fseq, window_size=5):
for i in xrange(len(fseq) - window_size + 1):
yield fseq[i:i+window_size]
for seq in window('abcdefghij', 3):
print seq
abc
bcd
cde
def
efg
fgh
ghi
hij