Для этого вы можете использовать понимание списка более enumerate(y)
, где вы нарезаете x
в соответствии с
частичной суммой по y до текущего индекса и
текущее значение
Это может выглядеть так:
x = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]
y = [2,3,1,5,6,4]
z = [x[sum(y[:i]):sum(y[:i])+v] for (i,v) in enumerate(y)]
print(z)
[[0, 1], [2, 3, 4], [5], [6, 7, 8, 9, 10], [11, 12, 13, 14, 15, 16], [17, 18, 19, 20]]
Чтобы сократить сумму суммирования пополам, вы можете использовать другое понимание списка, чтобы выполнить суммирование в одном месте:
x = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]
y = [2,3,1,5,6,4]
z = [x[s:s+v] for (s,v) in [(sum(y[:i]),y[i]) for i in range(len(y))]]
print(z)
[[0, 1], [2, 3, 4], [5], [6, 7, 8, 9, 10], [11, 12, 13, 14, 15, 16], [17, 18, 19, 20]]
Чтобы уменьшитьСуммируя еще больше, используйте reduce
, чтобы создать пары индексов для нарезки:
from functools import reduce
x = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]
y = [2,3,1,5,6,4]
z = [x[s:e] for s,e in reduce(
lambda c,x: c + [(c[-1][1], c[-1][1]+x)],
y[1:],
[(0,y[0])]
)]
[[0, 1], [2, 3, 4], [5], [6, 7, 8, 9, 10], [11, 12, 13, 14, 15, 16], [17, 18, 19, 20]]
print(z)