Вот сценарий, который должен помочь Вам.
Уход, если у Вас есть только один элемент в последнем подсписке, я не знаю, как Вы хотите иметь дело с этим случаем. Я полагал, что элемент является результатом этого подсписка, но возможно Вы хотите проигнорировать последний подсписок или иметь 0 в результате.
Объяснения являются комментариями в сценарии:
# Initial list
l = [0, 10, 20, 5, 10, 30, 20, 35]
# Number of elements to consider in each sublist.
STEP = 3
# Get the size of the list
length = len(l)
# The result list, empty at the beginning, that will be populated by the differences
result_list = []
# Iterate through sublists of exactly STEP elements
i = 0
while (i+STEP-1)<length:
result_list.append(l[i+STEP-1]-l[i])
i += STEP
# Special case for the possible little last sublist
# No difference done and element is kept if there is only one element
if i==length-1:
result_list.append(l[-1])
# Else, do the difference in the last sublist
elif i<length-1:
result_list.append(l[-1]-l[i])
<час> Вот сценарий, который берет max-min
из каждого подсписка как OP, которую спрашивают, прежде всего:
l = [1,2,3,4,5,6,7,8]
n = 3
def chunks(l, n):
"""Yield successive n-sized chunks from l."""
for i in range(0, len(l), n):
yield l[i:i + n]
# Create the sublists
grouped_l = list(chunks(l,n))
# Do the max-min on each sublists
res = []
for i in grouped_l:
res.append(max(i)-min(i))
Согласно просьбе в исходной версии вопроса, и согласно редактированиям, сделанным OP, мы создаем список увеличения последовательностей, затем вычисляем различия между макс. и минута каждого из них:
def spans(data):
sequences = [[data[0]]]
for val in data[1:]:
if val >= sequences[-1][-1]:
sequences[-1].append(val)
else:
sequences.append([val])
return [s[-1] -s[0] for s in sequences]
Образец, выполненный с данными OP:
data = [0, 10, 20, 5, 10, 30, 20, 35]
print(spans(data))
# [20, 25, 15]
Другой:
print(spans([2, 4, 6, 8, 9, 4, 5, -2, -1, 5, 4]))
# [7, 1, 7, 0]