Нарезка окон размером N из списка на каждом шаге - PullRequest
0 голосов
/ 11 января 2019

Если бы я должен был нарезать следующий список, скажем, с шагом 5, я мог бы легко сделать:

l = list(range(20))
l[::5]

Предоставление:

[0, 5, 10, 15]

Но что будет самым простым способом сделать то же самое, если выбрать центрированные окна размером 3 (или столько элементов, сколько доступно) на каждом шаге? Итак:

[0, 1, 4, 5, 6, 9, 10, 11, 14, 15, 16]

Пока я пытаюсь что-то вроде:

[[l[i-1],l[i],l[i+1]] for i in l[::5][1:]]

Что даже не возвращает уплощенный список.

1 Ответ

0 голосов
/ 11 января 2019

Использование нарезки списка внутри понимания списка:

[y for i in range(0, len(l), 5) for y in l[max(i-1, 0):i+2]]
# [0, 1, 4, 5, 6, 9, 10, 11, 14, 15, 16]

Обобщая, имеем

window = 3 // 2
[y for i in range(0, len(l), 5) for y in l[max(i-window, 0):i+window+1]]
# [0, 1, 4, 5, 6, 9, 10, 11, 14, 15, 16]

Другой вариант с использованием itertools islice и chain:

from itertools import islice, chain

list(chain.from_iterable(
    islice(l, max(i-1, 0), i+2) for i in range(0, len(l), 5)))
# [0, 1, 4, 5, 6, 9, 10, 11, 14, 15, 16]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...