По моему мнению, в вашем коде есть несколько вещей, на которые следует обратить внимание:
1) Главное и самое важное, что вы смешиваете элементы в вашем списке (числа с плавающей запятой) с их индексами, т.е.позиции в списке.Вам нужно перебирать индексы, а не сами элементы.Я имею в виду, что с учетом списка:
my_list = [5.67, 4.23, 7.88, 9.5]
индексы [5.67, 4.23, 7.88, 9.5]
соответственно: 0,1,2,3
.Python хочет иметь целое число для повторения, потому что он интерпретирует эти числа как положение элементов в списке, независимо от их значения.И позиции, очевидно, всегда должны быть целыми числами, т.е. вы либо 4-й, либо 5-й, а не 4,23-й.Однако это НЕ означает, что значения самих элементов должны быть целыми числами.Для учета этой разницы есть встроенная функция python enumerate()
:
>>> for index, value in enumerate([5.67, 4.23, 7.88, 9.5]):
... print (index, '->', value)
...
0 -> 5.67
1 -> 4.23
2 -> 7.88
3 -> 9.5
>>>
, по этой причине вам нужно было преобразовать ваши значения (не индексы) в целые числа и сделать трюк умноженияи деление на 10, чтобы не потерять разрешение 0,1, которое вы используете для сравнения.Вы можете забыть обо всем этом.
2) Вам не нужно проверять каждую итерацию, осталось ли в списке 100 элементов или нет.Достаточно итерировать до -100-го элемента:
for index, time in enumerate(times[:-100]):
, и он автоматически остановится на -100-м.Однако, когда вы делаете это, помните, что вы хотите всегда использовать index
в качестве переменной итератора, а не time
.Более того, в другом цикле for
вы можете использовать в другом случае, если вам нужно проверить, выполнено ли какое-либо условие для обработки текущего элемента, и если нет перехода к следующему, вы должны использовать continue
вместо break
:
for index, time in enumerate(times):
if index+100 > len(times):
continue
continue
выводит вас из оператора if
и приводит вас к циклу for
, готовому выполнить итерацию со следующим элементом.break
прервет цикл for
и остановит итерацию.
3) В конце каждой из ваших итераций вы получите
elif (...):
...
t += 1
else:
t += 1
, что во многом неправильно:
3.1) сначала потому, что вы находитесь внутри итератора, а t
относится к переменной, которую вы используете для итерации.Вам вообще не нужно указывать итератору сумму 1 к переменной итерации в конце каждой итерации.Делать это - это его единственная работа.Он знает.
3.2) Предполагая, что это будет любая другая переменная управления внутри цикла, которую вам действительно нужно вручную увеличить на единицу, вы повторяете строки кода.По сути, вы получите тот же эффект, если уберете предложение else
и удалите отступ последней строки предложения elif
:
elif (...):
...
t += 1
, поэтому алгоритм попадет в t +=1
относительно того,условие elif
выполнено или не выполнено.
3.3) Это связано с вышеупомянутым пунктом 1): В вашем конкретном случае и поскольку вы ошибочно используете t
для итерации (как обсуждалось выше),делая t += 1
, вы изменяете список, по которому вы перебираете, то есть вы изменяете входные данные.
Принимая все это во внимание, одним из возможных способов грубой реализации вашего кода может быть:
import numpy as np
times = 100*np.random.rand(150)
list_of_avgs = [np.sum(times[:100])/100.]
for index, element in enumerate(times[:-100]):
avg = np.sum(times[index:index+100])/100.
if avg + 0.1 <= list_of_avgs[-1]:
list_of_avgs.append(avg)
else:
continue
print (list_of_avgs)
, что приводит к (исходные данные генерируются очень часто):
[49.779866192794358, 49.594673775689778, 49.4409179407875,
49.304759324340424, 49.106580355542434, 48.651419303532919,
48.505888846346672, 47.834645246733295, 47.300679740055074,
46.956253292222293, 46.598627928361239, 46.427709019922297]
Приветствия и удачи!
D.