Замена элемента в списке без понимания списка, нарезка или использование []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)


Есть идеи, как исправить мое более длинное решение?

637   6  

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] = Y
Это, вероятно, не то, что задание хочет, чтобы вы сделали, но я оставлю его здесь для целей обучения. Примечание: не следует использовать list в качестве имени переменной, так как оно уже используется встроенной функцией. Вместо этого я использовал 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

    Ничего не найдено.