替换列表中的元素,无需列表理解、切片或使用 []s
Posted
技术标签:
【中文标题】替换列表中的元素,无需列表理解、切片或使用 []s【英文标题】:Replacing element in list without list comprehension, slicing or using [ ]s 【发布时间】:2013-09-17 13:22:30 【问题描述】:I'm taking this online Python course 他们不喜欢学生使用单线解决方案。本课程不接受此解决方案的括号。
我已经使用列表理解解决了这个问题,但是课程拒绝了我的回答。
问题如下:
使用
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' 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)
关于如何解决我的较长解决方案的任何想法?
【问题讨论】:
你的解决方法不对,应该是:print([Y if v == X else v for v in list])
。
试试for i, v in enumerate(list):
。
@Serdalis。你说得对。课程仍然不会接受该答案。
@Serdalis 该解决方案也不正确,因为它没有修改传递给它的列表,这是一个要求。
@Sven Marnach。我们不允许使用枚举。不是和in range(len(list))一样吗?
【参考方案1】:
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)
【讨论】:
@SvenMarnach 你是对的。我想到的方法是pop
。
@Serdalis 这个问题不允许它(无论出于何种原因)。
对不起,我误读为“不能使用列表构造函数”。你是对的。
@Asad。我们不允许使用枚举。不是和in range(len(list))一样吗?
@StacyM:如果不允许使用enumerate
,则可以使用手动索引变量,并在for
块的末尾执行i += 1
。【参考方案2】:
您也可以试试这个(不使用[]
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
。
【讨论】:
【参考方案3】:如果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]
【讨论】:
【参考方案4】:不要使用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))
【讨论】:
【参考方案5】:这对我有用。很直接。可能是一种减少行数的方法,但根据目前网站上所教的内容,这是可行的。
def replace(L, X, Y):
while X in L:
i = L.index(X)
L.insert(i, Y)
L.remove(X)
【讨论】:
【参考方案6】:完全同意 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)
【讨论】:
以上是关于替换列表中的元素,无需列表理解、切片或使用 []s的主要内容,如果未能解决你的问题,请参考以下文章