我有一个关于列表的简单问题
假设我要从列表中删除所有'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方法吗?
由于
答案 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']