2016-08-25 3 views
2

У меня есть список, который я хочу разделить на переменные размеры шагов. Например, если у меня есть список от 1 до 100, в конце каждой итерации, я хотел бы выход быть:Как разбить список по изменению размера шага?

[1, 2, 3] 
[4, 5, 6, 7, 8] 
[9, 10, 11, 12, ..., 15] 
[16, 17, ..., 25] 

Длина первого списка равна 3, то 5, а затем, 7 , затем 9.

Что у меня есть это

lst = list(range(1,101)) 
odd = 3 
for i in range(0, len(lst), odd): 
    print(lst[i:i+odd]) 
    odd += 2 

Я знаю, что это не работает, но я не знаю, что нужно изменить.

+0

Казалось бы, мне третий список должен заканчиваться 15, а не 16. – wim

ответ

2

Поскольку размер шага изменяется, требуется время цикла:

lst = list(range(1,101)) 
step = 3 
idx = 0 
while idx<len(lst): 
    print(lst[idx:idx+step]) 
    idx += step 
    step += 2 
+0

Чтобы сделать этот ответ более полно, пожалуйста, включите как 'диапазон (..)' 's размер шага не меняется каждый итерация. – SuperSaiyan

4

Следует отметить, что индексы, чтобы начать кусочек на задаются замкнутой форме:

n**2 - 1 

Поэтому:

>>> [lst[n**2-1:(n+1)**2-1] for n in range(1, 10)] 
[[1, 2, 3], 
[4, 5, 6, 7, 8], 
[9, 10, 11, 12, 13, 14, 15], 
[16, 17, 18, 19, 20, 21, 22, 23, 24], 
[25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35], 
[36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48], 
[49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63], 
[64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80], 
[81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99]] 
+0

это отлично подходит для конкретного примера, который я дал, но в чем заключался мой основной вопрос: как обрабатывать переменный размер шага – AlanH

0

Ответ Даниила является наиболее кратким, но я хотел бы указать, что иногда у вас более сложная ситуация и хотите иметь одинаковые фрагменты из разных итераций. Затем вы также можете пойти и сохранить фактические объекты slice(start,stop[,step]), которые генерирует python, когда вы пишете [start:stop:step] в списке и используете это. Например:

r1 = range(1,101) 
r2 = list(reversed(r1)) 

slices = [slice(0,5,3)] 
for i in range(20): 
    slices.append(slice(
         slices[-1].stop, 
         slices[-1].stop + slices[-1].step + 1, 
         slices[-1].step + 1) 
       ) 

print [ (r1[s],r2[s]) for s in slices ] 
Смежные вопросы