如果满足条件,如何在遍历列表时在列表中插入值?

问题; 遍历这个列表,无论你在哪里找到一个 2,修改列表,这样你就可以在它的前后加上标志“Found”和“Target”。


预期输入:l = [1,0,1,0,2,1,0,2,0,1]

预期输出:l = [1,0,1,0,"Found",2,"Target", 1,0,"找到",2,"目标",0,1]


看起来很容易?


l = [1,0,1,0,2,1,0,2,0,1]


for i in range(len(l)):

    if l[i] == 2:

        l.insert(i-1,"Found")

        l.insert(i-+,"Target")

但这会失败,但说明了这个想法?


我已经搜索了很多堆栈问题,但我似乎无法找到一个优雅的解决方案。我觉得我也在用错误的逻辑来解决这个问题,因为我相信你不应该改变你正在迭代的列表?


收到一只叮咚
浏览 184回答 3
3回答

湖上湖

是的,你是对的......你不应该改变你正在迭代的列表。因此,您需要创建列表的两个版本...一个是原始版本 ( 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]

九州编程

在迭代对象时更改对象通常不是一个好主意。这就是我将如何做到这一点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))

LEATH

如果我们不想创建新列表而只想修改第一个。这个使用与您相同的逻辑,但是我们必须使用全局索引进行迭代,这样我们就不会在重复的位置追加,也可以跳过不需要的位置。l = [1,0,1,0,2,1,0,2,0,1,2]print(l)k = 0for i in range(len(l)):    if l[k] == 2:        l.insert(k,"Found")        l.insert(k+2,"Target")        k+=3    else:        k += 1print(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']
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python