3 回答
TA贡献2003条经验 获得超2个赞
是的,你是对的......你不应该改变你正在迭代的列表。因此,您需要创建列表的两个版本...一个是原始版本 ( l),另一个是迭代后的原始版本 ( new_l)。
这就是我的意思:
l = [1,0,1,0,2,1,0,2,0,1]
new_l = []
for i in range(len(l)):
if l[i] == 2:
new_l.extend(["Found", l[i], "Target"])
else:
new_l.append(l[i])
print(new_l)
# [1,0,1,0,"Found",2,"Target",1,0,"Found",2,"Target",0,1]
TA贡献1785条经验 获得超4个赞
在迭代对象时更改对象通常不是一个好主意。
这就是我将如何做到这一点
l = [1,0,1,0,2,1,0,2,0,1]
new_l = []
for el in l:
if el == 2:
new_l.extend(["Found", el, "Target"])
else:
new_l.append(el)
请注意,我使用的是更“pythonic”且更高效的方法来遍历列表,而不是使用 range(len(l))。
第二种方法,我不会特别使用,但它可以给你另一个想法是使用 list comprhension + itertools.chain.from_iterable(itertools 是一个标准库包)。
new_l = (["Found", el, "Target"] if el == 2 else [el] for el in l)
new_l = list(itertools.chain.from_iterable(new_l))
TA贡献1936条经验 获得超6个赞
如果我们不想创建新列表而只想修改第一个。
这个使用与您相同的逻辑,但是我们必须使用全局索引进行迭代,这样我们就不会在重复的位置追加,也可以跳过不需要的位置。
l = [1,0,1,0,2,1,0,2,0,1,2]
print(l)
k = 0
for i in range(len(l)):
if l[k] == 2:
l.insert(k,"Found")
l.insert(k+2,"Target")
k+=3
else:
k += 1
print(l)
[1, 0, 1, 0, 2, 1, 0, 2, 0, 1, 2]
[1, 0, 1, 0, 'Found', 2, 'Target', 1, 0, 'Found', 2, 'Target', 0, 1, 'Found', 2, 'Target']
添加回答
举报