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)