迭代时插入Python列表
我使用的是Python3.5,而insert的性能并不像我预期的那样迭代时插入Python列表,python,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"]
scorelist = ["x","x"]
for q in range(0, len(scorelist)):
if scorelist[q] == "x":
scorelist.insert((q), " ")
我希望这会留下如下最少的读数
scorelist = ["x", " ", "x", " "]
相反,它留给我的是
scorelist = [" ", " ", "x", "x"]
我很困惑为什么这是输出。任何指导都将不胜感激。在遍历任何容器时对其进行变异通常是一个坏主意 在您的例子中,在for循环开始时,会对lenscorelist求值一次。此时长度为2,因此范围仅为[0,1]。以后什么都不可能改变这一点 在第一次迭代中,q是0,scorelist[0]是x,所以 将记分表保留为 在第二次迭代中,q是1,对于scorelist的新值,scorelist[1]仍然是x,所以 将记分表保留为 然后循环结束。它并没有什么神秘之处,但也很不明显——这就是为什么在遍历容器时对容器进行变异是个坏主意- 编辑:得到你想要的 如果您决定在末尾以及之前的每一对元素之间插入一个空格,那么有一种模糊的方法:
for q in reversed(range(1, len(scorelist) + 1)):
scorelist.insert(q, " ")
然后,例如,如果记分表以
['x', 'y', 'z']
该循环将使其保持不变
['x', ' ', 'y', ' ', 'z', ' ']
通过向后迭代,插入不会干扰原始列表元素的原始索引。如果这是令人困惑的提示:它是!;-,就像我为您的原始代码所解释的那样,一次只进行一次迭代。在迭代任何容器时对其进行变异通常是个坏主意 在您的例子中,在for循环开始时,会对lenscorelist求值一次。此时长度为2,因此范围仅为[0,1]。以后什么都不可能改变这一点 在第一次迭代中,q是0,scorelist[0]是x,所以 将记分表保留为 在第二次迭代中,q是1,对于scorelist的新值,scorelist[1]仍然是x,所以 将记分表保留为 然后循环结束。它并没有什么神秘之处,但也很不明显——这就是为什么在遍历容器时对容器进行变异是个坏主意- 编辑:得到你想要的 如果您决定在末尾以及之前的每一对元素之间插入一个空格,那么有一种模糊的方法:
for q in reversed(range(1, len(scorelist) + 1)):
scorelist.insert(q, " ")
然后,例如,如果记分表以
['x', 'y', 'z']
该循环将使其保持不变
['x', ' ', 'y', ' ', 'z', ' ']
通过向后迭代,插入不会干扰原始列表元素的原始索引。如果这是令人困惑的提示:它是!;-,就像我为您的原始代码所解释的那样,一次只进行一次迭代。这太有道理了。非常感谢。这很有道理。非常感谢。
['x', ' ', 'y', ' ', 'z', ' ']