Использование нарезки списка внутри понимания списка:
[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]