7

我正在学习这个在线 Python 课程,他们不喜欢学生使用单线解决方案。本课程不接受此解决方案的括号。

我已经使用列表理解解决了这个问题,但是课程拒绝了我的回答。

问题如下:

使用index和其他列表方法,编写一个函数replace(list, X, Y),将所有出现的Xinlist替换为Y。例如,如果L = [3, 1, 4, 1, 5, 9]thenreplace(L, 1, 7)将更改Lto的内容[3, 7, 4, 7, 5, 9]。为了使这个练习成为一个挑战,你不能使用[].

注意:你不需要使用return。

这是我到目前为止所拥有的,但由于 TypeError: 'int' object is not iterable 而中断。

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)

关于如何解决我更长的解决方案的任何想法?

4

6 回答 6

9

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)
于 2013-09-13T00:45:19.117 回答
3

您也可以试试这个(不使用[]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这里用过。

于 2013-09-13T00:46:56.830 回答
2

如果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]
于 2013-09-13T00:56:49.000 回答
1

不要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))
于 2013-09-13T01:00:17.390 回答
0

这对我有用。很直接。可能是一种用更少的行来完成它的方法,但是根据到目前为止网站上所教的内容,这是可行的。

def replace(L, X, Y):
   while X in L:
      i = L.index(X)
      L.insert(i, Y)
      L.remove(X)
于 2016-01-26T21:56:52.247 回答
0

完全同意 Asad Saeeduddin,但是 i 的第一个值必须是 -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)
于 2016-10-31T04:03:10.907 回答