Не могу исправить код для задания на stepik.org
Задание звучит так:"Напишите функцию modify_list(l), которая принимает на вход список целых чисел, удаляет из него все нечётные значения, а чётные нацело делит на два. Функция не должна ничего возвращать, требуется только изменение переданного списка, например:
lst = [1, 2, 3, 4, 5, 6]
print(modify_list(lst)) # None
print(lst) # [1, 2, 3]
modify_list(lst)
print(lst) # [1]
lst = [10, 5, 8, 3]
modify_list(lst)
print(lst) # [5, 4]
Функция не должна осуществлять ввод/вывод информации."
Мой код выглядит вот так (возможно он очень кривой, но я еще учусь :)) :
def modify_list(l):
for i in l:
if i%2==1:
l.remove(i)
L=[]
for i in l:
if len(l)!=0:
i=i//2
L+=[i]
l.clear()
l.extend(L)
return(l)
Код отлично работает когда в списке содержаться значения из примера (lst = [1, 2, 3, 4, 5, 6] и lst = [10, 5, 8, 3]), но когда в списке содержатся только нечётные значения, то программа, как и требуется, убирает все нечётные числа, но почему-то оставляет одно-два числа. Например, когда в списке находятся числа [1, 13, 7, 3], то программа на этапе проверка чётности или нечётности числа оставляет [13], и, соответственно в выводе даёт число [6].
Товарищи, не могли бы вы мне, глупенькому начинающему программисту, подсказать, как решить данный конфуз?
Ответы (3 шт):
Этот вопрос тут задают чуть не каждый день. Нельзя удалять элементы из списка, по которому вы итерируетесь - перебор элементов при этом ломается. Самое простое решение тут - итерироваться в for по копии списка, полученной через l[:], любо через l.copy(), либо через list(l).
Но вообще pythonic way - это не модифицировать имеющийся список, а создавать новый с помощью фильтрации, спискового включения и т.д. Тогда точно никаких проблем не будет. Ну если только ваш список не гигантский, а удалений/изменений мало - тогда допустимо модифицировать имеющийся список "на месте" (inplace).
я это так решил:
def modify_list(l):
i, n = 0, len(l)
while i < n:
if l[i] % 2:
l.pop(i)
n -= 1
else:
l[i] = l[i] // 2
i += 1
зато читаемо и красиво
добавлю сюда, потому что тоже не поняла до конца условия, т.к. формулировки не очень, и сама полезла искать ответы, не найдя ничего толкового
def modify_list(lst):
global l
l = [i // 2 for i in lst if i % 2 == 0]
объявляем новую глобальную переменную, это будет обновленный список через list comprehension, пробегаясь по всем элементам в исходном списке, выбираем из них только четные, сразу добавляем это число поделенное на два в новый список