我有一个列表,我正在尝试删除其中包含'pie'
的元素。这就是我所做的:
['applepie','orangepie', 'turkeycake']
for i in range(len(list)):
if "pie" in list[i]:
del list[i]
我一直在使列表索引超出范围,但是当我将del
更改为print
语句时,它会打印出正常的元素。
答案 0 :(得分:6)
不要从列表中删除您正在迭代的项目,而是尝试使用Python的list comprehension syntax创建一个新列表:
foods = ['applepie','orangepie', 'turkeycake']
pieless_foods = [f for f in foods if 'pie' not in f]
答案 1 :(得分:2)
在迭代期间删除元素,更改大小,导致IndexError。
您可以将代码重写为(使用列表理解)
L = [e for e in L if "pie" not in e]
答案 2 :(得分:2)
类似的东西:
stuff = ['applepie','orangepie', 'turkeycake']
stuff = [item for item in stuff if not item.endswith('pie')]
修改一个你正在迭代的对象应该被视为禁止使用。
答案 3 :(得分:1)
您收到错误的原因是因为您在删除某些内容时更改了列表的长度!
示例:
first loop: i = 0, length of list will become 1 less because you delete "applepie" (length is now 2)
second loop: i = 1, length of list will now become just 1 because we delete "orangepie"
last/third loop: i = 2, Now you should see the problem, since i = 2 and the length of the list is only 1 (to clarify only list[0] have something in it!).
所以请使用类似的东西:
for item in in list:
if "pie" not in item:
new list.append(item)
答案 4 :(得分:0)
另一种更长的方法是记下遇到饼的索引并在第一个for循环后删除这些元素