删除元素会使索引混乱

时间:2013-12-09 07:58:42

标签: python list

我有一个关于列表的简单问题

假设我要从列表中删除所有'a':

list = ['a', 'a', 'b', 'b', 'c', 'c']
for element in list:
    if element == 'a':
        list.remove('a')

print list

==>结果:

['a', 'b', 'b', 'c', 'c', 'd', 'd']

我知道这种情况正在发生,因为在我删除第一个'a'后,列表索引得到了

增加,而所有元素都被左推1。

在其他语言中,我想解决这个问题的一种方法是从列表末尾向后迭代..

然而,迭代遍历reverse(list)会返回相同的错误。

有解决这个问题的pythonic方法吗?

由于

3 个答案:

答案 0 :(得分:4)

更多Pythonic方式之一:

>>> filter(lambda x: x != 'a', ['a', 'a', 'b', 'b', 'c', 'c'])
['b', 'b', 'c', 'c']

答案 1 :(得分:3)

迭代时不应修改列表。

更好的方法是使用list comprehension排除项目:

list1 = ['a', 'a', 'b', 'b', 'c', 'c']
list2 = [x for x in list1 if x != 'a']

注意:不要在Python中使用list作为变量名称 - 它会掩盖内置的list类型。

答案 2 :(得分:0)

你是对的,当你在迭代它时从列表中删除一个项目时,列表索引会不同步。其他现有答案暗示的是,您需要创建一个新列表并仅复制您想要的项目。

例如:

existing_list = ['a', 'a', 'b', 'c', 'd', 'e']

new_list = []

for element in existing_list:
    if element != 'a':
        new_list.append(element)

existing_list = new_list
print existing_list

输出:['b', 'c', 'd', 'e']