Окончательный ответ:
Если вы не хотите повторять элементы, попробуйте вместо этого:
import numpy as np
l = list(range(1, 301))
step = 4
length = 3
size = step * length
result = np.array(l).reshape(len(l) // size, length, step).transpose(0, 2, 1).reshape(len(l) // length, length)
Результат:
array([[ 1, 5, 9],
[ 2, 6, 10],
[ 3, 7, 11],
[ 4, 8, 12],
[ 13, 17, 21],
[ 14, 18, 22],
[ 15, 19, 23],
[ 16, 20, 24],
[ 25, 29, 33],
...
[277, 281, 285],
[278, 282, 286],
[279, 283, 287],
[280, 284, 288],
[289, 293, 297],
[290, 294, 298],
[291, 295, 299],
[292, 296, 300]])
Обновлено Оригинальный ответ:
Исходя из уточненного требования, вы можете сделать следующее:
step = 4
result = [l[i:i+step*2+1:step] for i in range(len(l)-step*2)]
Результат:
[[1, 5, 9],
[2, 6, 10],
[3, 7, 11],
...
[290, 294, 298],
[291, 295, 299],
[292, 296, 300]]
Объяснение:
step = 4 # the spacing between each element in the
# ┌ loop from 0 to 2 steps before list ends (300 - 8 = 292)
result = [l[i:i+step*2+1:step] for i in range(len(l)-step*2)]
# │ │ │ └ skip every step (4)
# │ │ └ end after step occured twice (8); the +1 is needed because end index is not returned.
# │ └ start from index i (0, 1, 2,... 291, 292)
# └ slice list l into a triplet
Оригинальный ответ:
Поскольку вы уже используете numpy
для 900 элементов, вы можете просто сделать это:
np.array(l).reshape(3, len(l)//3).T
, что дает вам:
array([[ 1, 5, 9],
[ 2, 6, 10],
[ 3, 7, 11],
[ 4, 8, 12]])
Если вынужно обратно как list
вы можете просто сделать .tolist()
:
np.array(l).reshape(3, len(l) //3).T.tolist()
# [[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]