Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 替换列表中的元素而不进行列表理解、切片或使用[]s_Python_List_Replace_List Comprehension - Fatal编程技术网

Python 替换列表中的元素而不进行列表理解、切片或使用[]s

Python 替换列表中的元素而不进行列表理解、切片或使用[]s,python,list,replace,list-comprehension,Python,List,Replace,List Comprehension,而且他们不喜欢学生使用单线解决方案。本课程不接受此解决方案的括号 我已经用列表理解法解决了这个问题,但课程拒绝了我的答案 问题是: 使用index和其他列表方法,编写一个函数replace(list,X,Y),将list中出现的X替换为Y。例如,如果L=[3,1,4,1,5,9]则replace(L,1,7)将L的内容更改为[3,7,4,7,5,9]。要使此练习成为挑战,您不允许使用[] 注意:您不需要使用return 这是我到目前为止所拥有的,但由于TypeError而中断:“int”对象是不

而且他们不喜欢学生使用单线解决方案。本课程不接受此解决方案的括号

我已经用列表理解法解决了这个问题,但课程拒绝了我的答案

问题是:

使用
index
和其他列表方法,编写一个函数
replace(list,X,Y)
,将
list
中出现的
X
替换为
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)
关于如何修复较长的解决方案,有什么想法吗?

range()
返回一个整数的平面列表,因此不能将其分解为两个参数。使用
枚举
获取索引和值元组:

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)
如果不允许使用
枚举
,请使用普通的旧计数器:

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)
最后,您可以使用问题作者可能正在寻找的方法(尽管这是最低效的方法,因为它在每次迭代时都会线性搜索列表):

您也可以尝试此操作(根据需要,不使用
[]
s或
enumerate()
):

这可能不是作业想要你做的,但我会把它留在这里,以供学习之用


注意:您不应该使用
list
作为变量名,因为内置函数已经使用了该变量名。我在这里使用了
l

如果不允许
枚举
,也可以使用
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)

完全同意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)

您的解决方案是错误的,它应该是:
print([Y如果v==X,则v表示列表中的v])
。你说得对。课程仍然不会接受这个答案。@Serdalis解决方案是不正确的,因为它没有修改传递给它的列表,这是一项要求。@Sven Marnach。我们不允许使用枚举。这和射程(len(list))不一样吗?@SvenMarnach你说得对。我想到的方法是
pop
@Serdalis问题不允许它(无论出于什么原因)。很抱歉,我误解为“不能使用列表构造函数”。你说得对。@Asad。我们不允许使用枚举。它与范围(len(list))中的不一样吗?@StacyM:如果不允许
枚举
,您可以使用手动索引变量,并在
块的
末尾执行
i+=1
def replace(L, X, Y):
   while X in L:
      i = L.index(X)
      L.insert(i, Y)
      L.remove(X)
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)