Итератор скользящего / скользящего окна без нарезки и импорта? - PullRequest
0 голосов
/ 07 февраля 2019

Как я могу добиться скользящего / скользящего окна, используя 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)

1 Ответ

0 голосов
/ 07 февраля 2019

Я думаю, что это то, что вы хотите:

def windows(iterable, n, m):
    it = iter(iterable)
    cur = []
    while True:
        try:
            while len(cur) < n:
                cur.append(next(it))
            yield tuple(cur)
            for _ in range(m):
                if cur:
                    cur.pop(0)
                else:
                    next(it)
        except StopIteration:
            return

print(list(windows(range(10), 3, 2)))
# [(0, 1, 2), (2, 3, 4), (4, 5, 6), (6, 7, 8)]

print(list(windows(range(10), 2, 3)))
# [(0, 1), (3, 4), (6, 7)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...