Если вы предварительно вычислили некоторые индексы, вы можете реконструировать любое окно с помощью виртуального однострочного:
import itertools
import operator
n=4; d=2
x = [[1,2,3],[4,5,6],[7,8,9,10]]
indices = [(i, j) for i, sublist in enumerate(x) for j in range(len(sublist))]
def window(x, start, stop, indices):
return [
[x[i][j] for i, j in g]
for _, g in itertools.groupby(
indices[start:stop],
key=operator.itemgetter(0))
]
def flat_len(x):
"""Return length of flattened list."""
return sum(len(sublist) for sublist in x)
for i in range(0,flat_len(x)-n+1,d):
print(window(x,i,i+n,indices))
# Output:
# [[1, 2, 3], [4]]
# [[3], [4, 5, 6]]
# [[5, 6], [7, 8]]
Обновление:
Оптимизированная версия, если возможно копирование целых подсписков. start
и stop
должны находиться в допустимом диапазоне
def window(x, start, stop):
first = indices[start][0]
last = indices[stop-1][0]
return [
[x[i][j] for i, j in g] if k in (first, last) else x[k]
for k, g in itertools.groupby(
indices[start:stop],
key=operator.itemgetter(0))
]