Как я могу добиться скользящего / скользящего окна, используя iter и далее, не используя slice, itertools, len () и т. Д.?Это то, что я до сих пор, но, очевидно, это не работает, из-за добавления (следующий (итератор)).И я не могу найти хорошего решения для этого.
def windows(iterable,n, m):
while True:
try:
empty_list = []
append = empty_list.append
for i in range(s, e):
append(next(iterator))
yield empty_list
s += m
e += m
check += 1
except StopIteration:
return
Я нашел этот код, который делает именно то, что я хочу, но он не работает с моими параметрами.Так как в моем итерируемом параметре используется метод disguise, а именно:
def disguise(iterable):
for x in iterable:
yield x
Я могу просто перебирать значения в списке, но не разрешать делать, также такие детали, как "для i в диапазоне (-1, -j-1, -1) "меня сильно смутило то, что происходит. Итератор скользящего или скользящего окна?
def window(seq, size, step=1):
# initialize iterators
iters = [iter(seq) for i in range(size)]
# stagger iterators (without yielding)
[next(iters[i]) for j in range(size) for i in range(-1, -j-1, -1)]
while(True):
yield [next(i) for i in iters]
# next line does nothing for step = 1 (skips iterations for step > 1)
[next(i) for i in iters for j in range(step-1)]
Есть ли более простой подход к этой проблеме?
Желаемый результат будет:
[['a', 'b', 'c'], ['c', 'd', 'e'], ['e', 'f', 'g'], ['g', 'h', 'i'], ['i', 'j', 'k']]
из вызова метода так:
win(disguise('abcdefghijk'),3,2)