为什么我不能在for循环中复制所选项?

时间:2016-03-24 00:53:09

标签: python python-3.x

就像我有一个列表:letters = ['a', 'b', 'c'] 我想在列表的第一个插入'c'

for letter in letters:
    if letter == 'c':
        letters.insert(0, letter)

当我点击进入时,没有任何事情发生,我必须强行退出我的终端...

3 个答案:

答案 0 :(得分:7)

在迭代它们时,不应该改变列表,字典或其他类似的容器。解决这个问题的一种方法是复制迭代:

for letter in letters[:]:
    if letter == 'c':
        letters.insert(0, letter)

答案 1 :(得分:2)

为什么你的代码永远循环是你继续在开始时插入一个元素所以所有的元素都被移动所以你不断找到"c"并点击一个无限循环,你可以在下面看到当你插入所有元素时超过一个:

 ["a","b","c"] # 3rd iteration   at "c" c == c insert new c 
   0,  1 , 2

 ["c","a","b","c"] # 4th at "c" again c == c insert new c
   0,  1, 2 , 3

 ["c","c","a","b","c"] # 5th at "c" again! c == c insert new c ....
  0,   1,  2 , 3,  4

更快更安全的方法是计算事件数,然后创建一个新列表:

letters = ['a', 'b', 'c']
cn = letters.count("c")
letters = ["c"] * letters.count("c") + letters

print(letters)

每次进行插入时,都必须移动列表中的所有元素,这样如果你有很多匹配项,那么你将会进行大量的移动。

答案 2 :(得分:1)

只是为了好玩,试试这个:)

import time
letter = ['a', 'b', 'c']

for letter in letters:
    if letter == 'c':
        letters.insert(0, letter)
        print(letters)
        time.sleep(1)