Замена элемента в списке без понимания списка, нарезка или использование []s
Я беру этот онлайн-курс Python , и они не любят, когда студенты используют однострочные решения. Курс не будет принимать скобки для этого решения.
Я уже решил задачу, используя понимание списка, но курс отклонил мой ответ.
Задача гласит:
Используя
indexи другие методы списка, напишите функциюreplace(list, X, Y), которая заменяет все вхожденияXвlistнаY. Например, еслиL = [3, 1, 4, 1, 5, 9], тоreplace(L, 1, 7)изменится содержание отLдо[3, 7, 4, 7, 5, 9]. Чтобы сделать это упражнение вызовом, вам не разрешается использовать[].
Примечание: вам не нужно использовать return.
Это то, что у меня есть до сих пор, но он ломается из-за TypeError: 'int' объект не является итерационным.
list = [3, 1, 4, 1, 5, 9]
def replace(list, X, Y):
while X in list:
for i,v in range(len(list)):
if v==1:
list.remove(1)
list.insert(i, 7)
replace(list, 1, 7)
Это был мой первоначальный ответ, но он был отвергнут.
list = [3, 1, 4, 1, 5, 9]
def replace(list, X, Y):
print([Y if v == X else v for v in list])
replace(list, 1, 7)
Есть идеи, как исправить мое более длинное решение?
6 ответов:
range()возвращает плоский список целых чисел, поэтому вы не можете распаковать его в два аргумента. Используйтеenumerateдля получения кортежей индексов и значений:def replace(l, X, Y): for i,v in enumerate(l): if v == X: l.pop(i) l.insert(i, Y) l = [3, 1, 4, 1, 5, 9] replace(l, 1, 7)Если вы не можете использовать
enumerate, используйте обычный старый счетчик:Наконец, вы можете использовать то, что, вероятно, искали авторы вопроса (хотя это самый неэффективный подход, так как он линейно ищет по списку на каждой итерации):def replace(l, X, Y): i = 0 for v in l: if v == X: l.pop(i) l.insert(i, Y) i += 1 l = [3, 1, 4, 1, 5, 9] replace(list, 1, 7)def replace(l, X, Y): for v in l: i = l.index(v) if v == X: l.pop(i) l.insert(i, Y) l = [3, 1, 4, 1, 5, 9] replace(l, 1, 7)
Вы также можете попробовать это (не используя
[]s илиenumerate(), как требуется):Это, вероятно, не то, что задание хочет, чтобы вы сделали, но я оставлю его здесь для целей обучения. Примечание: не следует использоватьfor i in range(len(l)): # loop over indices if l.__index__(i) == X: # i.e. l[i] == X l.__setitem__(i, Y) # i.e. l[i] = Ylistв качестве имени переменной, так как оно уже используется встроенной функцией. Вместо этого я использовалlздесь.
Если
enumerateне разрешено, можно также использовать циклwhile.>>> def replace(L_in, old_v, new_v): while old_v in L_in: idx=L_in.index(old_v) L_in.pop(idx) L_in.insert(idx, new_v) >>> L = [3, 1, 4, 1, 5, 9] >>> replace(L, 1, 7) >>> L [3, 7, 4, 7, 5, 9]
Не используйте
listв качестве имени, это причинит вам много боли.def replace(my_list, X, Y): while X in my_list: my_list.insert(my_list.index(X), Y) my_list.pop(my_list.index(X))
Это сработало для меня. Довольно прямолинейно. Возможно, это способ сделать это с меньшим количеством строк, но, основываясь на том, что было преподано на веб-сайте до сих пор, это работает.
def replace(L, X, Y): while X in L: i = L.index(X) L.insert(i, Y) L.remove(X)
Полностью согласен с Асадом Саидуддином но, 1-е значение i должно быть -1, это поможет заменить 1-й объект в списке нуждающихся
def replace(l, X, Y): i = -1 for v in l: i += 1 if v == X: l.pop(i) # remove item at given position (position number i) l.insert(i, Y) # insert item Y at position i l = [1, 1, 4, 1, 5, 9] replace(l, 1, 7) print(l)
Comments