Обтекание бегущего окна в списке - PullRequest
0 голосов
/ 20 февраля 2019

Я хочу разделить список на куски одинакового размера, используя «скользящее окно», но вместо того, чтобы усекать список на концах, я хочу обернуть его так, чтобы окончательный кусок можно было распределить по началу и концусписок.

Например, для данного списка:

l = [1, 2, 3, 4, 5, 6]

Я хочу создать куски размером n = 3 следующим образом:

[1, 2, 3], [4, 5, 6]
[2, 3, 4], [5, 6, 1]
[3, 4, 5], [6, 1, 2]

Или то же самоесписок с кусками размером n = 2 должен быть разбит следующим образом:

[1, 2], [3, 4], [5, 6]
[2, 3], [4, 5], [6, 1]

Список не может быть равномерно разделен на n подсписков (например, если исходный список имеет длину 7 и n = 3 - или любое значениекроме 7 или 1).Округленное значение len(l) / n можно использовать для определения размера разделения, как в обычном случае.

Этот пост связан, хотя и не переносится так, как мне нужно.Я попробовал, но не смог ничего полезного.Любые предложения приветствуются!

1 Ответ

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

Вы можете использовать itertools.islice поверх итератора циклического преобразования, сгенерированного из itertools.cycle:

from itertools import cycle, islice
def rolling_chunks(l, n):
    return ([list(islice(cycle(l), i + j, i + j + n)) for j in range(0, len(l), n)] for i in range(n))

, так что list(rolling_chunks(l, 3)) возвращает:

[[[1, 2, 3], [4, 5, 6]], [[2, 3, 4], [5, 6, 1]], [[3, 4, 5], [6, 1, 2]]]

и list(rolling_chunks(l, 2)) возвращает:

[[[1, 2], [3, 4], [5, 6]], [[2, 3], [4, 5], [6, 1]]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...