2012-04-02 77 views
5
listA = [1,2,3] 
listB = [] 

print listA 
print listB 

for i in listA: 
     if i >= 2: 
       listB.append(i) 
       listA.remove(i) 
print listA 
print listB 

爲什麼只能添加和移除元素「2」?在列表之間移動Python元素

另外,當我註釋掉「listA.remove(i)」時,它按預期工作。

回答

12

您不應該修改您正在迭代的列表,這會導致令人驚訝的行爲(因爲迭代器在內部使用索引,並且通過刪除元素來更改這些索引)。你可以做的是要遍歷一個副本listA的:

for i in listA[:]: 
    if i >= 2: 
    listB.append(i) 
    listA.remove(i) 

例子:

>>> listA = [1,2,3] 
>>> listB = [] 
>>> for i in listA[:]: 
... if i >= 2: 
...  listB.append(i) 
...  listA.remove(i) 
... 
>>> listA 
[1] 
>>> listB 
[2, 3] 

然而,它往往是乾淨多了去了功能性的方式,而不是修改原來的列表中的所有,而是隻需創建一個包含所需值的新列表。您可以使用列表理解這樣做優雅:

>>> lst = [1,2,3] 
>>> small = [a for a in lst if a < 2] 
>>> big = [a for a in lst if a >= 2] 
>>> small 
[1] 
>>> big 
[2, 3] 
+0

你應該做的是建立所需的輸出列表,然後也許扔掉原來的(或指定了它),如果你不再需要它。 – 2012-04-02 02:22:59

+0

@Karl:我剛剛添加了一個列表理解來做到這一點。 – 2012-04-02 02:23:21

+0

@NiklasB。列表理解正是我最終做的,但我不確定最初爲什麼會遇到問題。 – devinpleuler 2012-04-02 02:28:04