Неправильный результат выполнения программы
Не могу понять, в чём заключается ошибка. Программа должна в массиве найти элементы, кратные 5, затем уменьшить их на 2 и вывести полученный массив. Выводит не то, что нужно. Буду благодарна, если поможете найти ошибку.
a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
j = 2
for i in a:
if i % 5 == 0:
k = i - j
a.insert(k, a.index(i))
a.remove(i)
print(a)
Ответы (3 шт):
Проблема в строке
a.insert(k, a.index(i))
Метод insert принимает первым аргументом индекс, а вторым - значение, а у вас наоборот.
Но, на самом деле, на реальных задачах следует помнить, что методы index, insert, remove достаточно затратные. Если выражаться научным языком, то они имеет линейную сложность - то есть каждый раз при использовании они перебирает элементы списка, и, в худшем случае, им приходится поэлементно перебрать весь список.
Поэтому лучше делать так:
a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
j = 2
for idx, value in enumerate(a):
if value % 5 == 0:
a[idx] -= j
print(a)
a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
j = 2
for i in a:
if i % 5 == 0:
k = i - j
a[i-1] = k
print(a)
Вообще говоря, нехорошо модифицировать список, по которому вы итерируетесь. Это может привести к неожиданным эффектам. Поэтому лучше генерировать новый список на основе старого:
a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
print([x - 2 if x % 5 == 0 else x for x in a])
Результат:
[1, 2, 3, 4, 3, 6, 7, 8, 9, 8]
P.S. enumerate не нужен, это я прогнал :)
P.P.S. Если вы не делаете вставку и удаление в итерируемый список, а только меняете элементы по индексу, то так делать в принципе можно (хотя это тоже зависит от внутренней реализации списка в языке, лучше так делать не со списками, а с массивами фиксированного размера, например numpy array):
a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
for (i,x) in enumerate(a):
if x % 5 == 0:
a[i] -= 2
print(a)