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條經驗 獲得超7個贊
如果我們不想創建新列表而只想修改第一個。
這個使用與您相同的邏輯,但是我們必須使用全局索引進行迭代,這樣我們就不會在重復的位置追加,也可以跳過不需要的位置。
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']
添加回答
舉報