在列表之间移动Python元素

时间:2012-04-02 02:17:12

标签: python

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”?

另外,当我注释掉“listA.remove(i)”时,它按预期工作。

1 个答案:

答案 0 :(得分: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]