迭代时插入Python列表

2024-04-18 00:21:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用的是python3.5,insert的行为与我预期的不一样。你知道吗

scorelist = ["x","x"]

for q in range(0, len(scorelist)):
    if scorelist[q] == "x":
        scorelist.insert((q), " ")

我希望留下最少的读数如下

scorelist = ["x", " ", "x", " "]

相反,它留给我

scorelist = [" ", " ", "x", "x"]

我很困惑为什么这是输出。任何指导都将不胜感激。你知道吗


Tags: inforlenifrangeinsert指导读数
1条回答
网友
1楼 · 发布于 2024-04-18 00:21:46

在遍历任何容器时对其进行变异通常是个坏主意。你知道吗

在您的例子中,len(scorelist)for循环开始时计算一次。当时长度是2,所以范围就是[0, 1]。以后什么也改变不了这一点。你知道吗

在第一次迭代中,q是0,scorelist[0]"x",所以

scorelist.insert(0, " ")

scorelist保留为

[" ", "x", "x"]

在第二次迭代中,q是1,对于scorelist的新值,scorelist[1]仍然是"x",所以

scorelist.insert(1, " ")

scorelist保留为

[" ", " ", "x", "x"]

然后循环结束。关于它,没有什么真正神秘的东西,但也一点都不明显——这就是为什么在遍历容器时对容器进行变异是个坏主意;-)

编辑:得到你想要的

如果您决定在结尾处以及之前的每一对元素之间插入一个空格,那么有一种模糊的方法:

for q in reversed(range(1, len(scorelist) + 1)):
    scorelist.insert(q, " ")

然后,例如,如果scorelist开始为

['x', 'y', 'z']

这个循环会让它

['x', ' ', 'y', ' ', 'z', ' ']

通过“向后”迭代,插入不会干扰原始列表元素的原始索引。如果这让人困惑(提示:是的!;-)),只需一次迭代一次,就像我为您的原始代码所解释的那样。你知道吗

相关问题 更多 >

    热门问题