Заменить числа списка в цикле for

Есть небольшой тестовый код, который делает проверку значений в списке. Если значение не удовлетворяет условие, то оно будет заменено на эталонное значение. Чтобы записать новые значение мне приходится создавать новый пустой список в начале и записывать всё в него. Можно как-нибудь перезаписывать число в исходном списке без создания new_step_time_row? И какие могут быть рекомендации, чтобы сделать код лаконичнее?

dec_rate = 0
# Количество считанных значений в секунду
values_per_second = 4250 / (dec_rate + 1)
# Эталонное время между каждым новым значением
reference_time = 1 / values_per_second
# Доверительный интервал
сonfidence_interval_up = reference_time * 1.5
сonfidence_interval_down = reference_time * 0.5

step_time_row = [0.00023529, 0.00036, 0.00038, 0.00023458456,
                 0.00021529, 0.00019529, 0.00010529, 0.00009529,
                 0.00028529, 0.00036529, 0.00029529, 0.00021529]

new_step_time_row = []

# Цикл, который проверяет входит ли время в допустимые пределы.
# Если не входит, то заменяется эталонным временем.
for number in step_time_row:
    if number > сonfidence_interval_up or number < сonfidence_interval_down:
        number = reference_time
    new_step_time_row.append(number)

print(new_step_time_row)

Ответы (3 шт):

Автор решения: leach

Нашёл решение замены элементов непосредственно в исходном списке:

# Значение number меняется в диапазоне от 0 до
# индекса последнего элемента списка, который
# равен длине списка за минусом 1.
for number in range(len(step_time_row)):
    # Если элемент с индексом number больше или меньше сonfidence_interval,
    if step_time_row[number] > сonfidence_interval_up or step_time_row[number] < сonfidence_interval_down:
        step_time_row[number] = reference_time # то он заменяется на эталон 
→ Ссылка
Автор решения: asanisimov

Чуть более лаконично через функцию map. Так же там можно было использовать lambda функцию.

dec_rate = 0
# Количество считанных значений в секунду
values_per_second = 4250 / (dec_rate + 1)
# Эталонное время между каждым новым значением
reference_time = 1 / values_per_second
# Доверительный интервал
сonfidence_interval_up = reference_time * 1.5
сonfidence_interval_down = reference_time * 0.5

step_time_row = [0.00023529, 0.00036, 0.00038, 0.00023458456,
                 0.00021529, 0.00019529, 0.00010529, 0.00009529,
                 0.00028529, 0.00036529, 0.00029529, 0.00021529]

new_step_time_row = []

# Цикл, который проверяет входит ли время в допустимые пределы.
# Если не входит, то заменяется эталонным временем.
for number in step_time_row:
    if number > сonfidence_interval_up or number < сonfidence_interval_down:
        number = reference_time
    new_step_time_row.append(number)

print(new_step_time_row)


def change_number(number):
    if number > сonfidence_interval_up or number < сonfidence_interval_down:
        number = reference_time
    return number


new_step_time_row_v2 = list(map(change_number, step_time_row))
print(new_step_time_row == new_step_time_row_v2)
print(new_step_time_row_v2)
→ Ссылка
Автор решения: passant

Если главное требование именно лаконичность кода, а за одно и скорость при больших наборах данных, то я бы сделал вообще в одну строку, через numpy (и никаких циклов):

step_time_row=np.array(step_time_row)
step_time_row[(step_time_row > сonfidence_interval_up) | (step_time_row< сonfidence_interval_down)] = reference_time
→ Ссылка