为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

收到一只叮咚 2022-11-18 18:20:05
问题; 遍历这个列表,无论你在哪里找到一个 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")但这会失败,但说明了这个想法?我已经搜索了很多堆栈问题,但我似乎无法找到一个优雅的解决方案。我觉得我也在用错误的逻辑来解决这个问题,因为我相信你不应该改变你正在迭代的列表?
查看完整描述

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]


查看完整回答
反对 回复 2022-11-18
?
九州编程

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))



查看完整回答
反对 回复 2022-11-18
?
LEATH

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']


查看完整回答
反对 回复 2022-11-18
  • 3 回答
  • 0 关注
  • 100 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信