在Python中从List中删除元素

时间:2014-12-12 12:24:46

标签: python list python-3.x

我正在使用python 3.4并且只是学习基础知识,所以请耐心等待..

listA = [1,2]
for a in listA:
    listA.remove(a)
print(listA)

假设我得到一个空列表,但我得到的是一个值为'2'的列表。我用大号调试代码。列表中的值以及列表具有单个元素时for循环退出。 为什么最后一个元素没有从列表中删除..?

3 个答案:

答案 0 :(得分:5)

迭代时不应更改列表。删除项目时,列表的索引会发生变化,因此永远不会评估某些项目。改为使用列表推导,它会创建一个新列表:

[a for a in list if ...]

换句话说,尝试这样的事情:

>>> A = [1, 2, 3, 4]
>>> A = [a for a in A if a < 4]       # creates new list and evaluates each element of old
>>> A
[1, 2, 3]

使用for循环时,使用内部计数器。如果在迭代list的同时将剩余元素向左移动,则不会评估剩余list中最左侧的元素。请参阅note for the for statement

答案 1 :(得分:2)

发生这种情况是因为for的长度仅在开始时进行评估,并且在循环时修改列表:

>>> l = [1,2,3]
>>> l
[1, 2, 3]
>>> for a in l:
    print(a)
    print(l)
    l.remove(a)
    print(a)
    print(l)
    print("---")


1
[1, 2, 3]
1
[2, 3]
---
3
[2, 3]
3
[2]
---
>>>

请参阅?用于索引列表并在其上循环的隐式变量的值会增加并跳过第二个元素。

如果要清空列表,请执行以下操作:

>>> l.clear()
>>> l
[]

或者在列表上使用不同的循环方式,如果需要在循环时修改它。

答案 2 :(得分:0)

正如@Justin在评论中所提到的,在迭代时不要改变列表。当您继续从列表中删除元素时,列表的大小会缩小,这将更改元素的索引。

如果您需要逐个删除列表中的元素,请迭代列表副本,保留原始列表,同时修改流程中的重复列表。

>>> listA = [1,2,3,4]
>>> listB = [1,2,3,4]

>>> for each in listA:
...     print each
...     listB.remove(each)
1
2
3
4
>>> listB
[]