迭代时的Python列表插入

时间:2016-09-11 04:08:53

标签: python

我正在使用python 3.5,并且插入行为不像我期望的那样。

scorelist = ["x","x"]

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

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

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

相反,它留给我

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

我很难过为什么这是输出。任何指导都将不胜感激。

1 个答案:

答案 0 :(得分:6)

在迭代任何容器时改变任何容器通常都是一个坏主意。

在您的情况下,在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"]

然后循环结束。它并没有什么神秘之处,但它也不是很明显 - 这是为什么在迭代容器时改变容器的坏主意; - )< / p>

编辑:获得你想要的东西

如果您决定在结尾处插入空白,并在此之前插入每对元素之间,请执行以下一种不明确的方法:

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

然后,例如,如果scorelist

开头
['x', 'y', 'z']

该循环将其保留为

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

通过迭代&#34;向后&#34;,插入不会干扰原始列表元素的原始索引。如果这让人感到困惑(提示:它是!;-)),那么一次只进行一次迭代,就像我为原始代码拼写出来一样。