Неправильный результат выполнения программы

Не могу понять, в чём заключается ошибка. Программа должна в массиве найти элементы, кратные 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 шт):

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

Проблема в строке

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)
→ Ссылка
Автор решения: Brain of madness
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)
→ Ссылка
Автор решения: CrazyElf

Вообще говоря, нехорошо модифицировать список, по которому вы итерируетесь. Это может привести к неожиданным эффектам. Поэтому лучше генерировать новый список на основе старого:

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)
→ Ссылка