a=['abc', '234', 'wdg', '220', '400', '395', '230', '350', ' ', '300', '300', '340', '420', '190', '300', '380', '270', 'wdg', '350', '380']
for i in range(len(a)):
if a[i]=="wdg":
a.pop(i)
print(a)
当我运行这些代码时,错误消息显示“ IndexError:列表索引超出范围”。(在行中,如果a [i] ==“ wdg”:“) 它出什么问题了?我想在列表中找到所有的“ wdg”并将其删除
答案 0 :(得分:1)
每次弹出项目时列表都会变短,因此到结束时,索引的长度大于列表的长度。尝试理解列表:
newList=[x for x in a if x!="wdg"]
答案 1 :(得分:1)
在遍历列表时不要从列表中删除项目。每当您从列表中pop
时,列表的长度都会减少一。但是您永远不会考虑循环中的这种变化。这将导致list index out of range
并突然停止您的程序。
一种更安全有效的方法是使用如下列表理解:
a = ['abc', '234', 'wdg', '220', '400', '395', '230', '350', ' ', '300', '300', '340', '420', '190', '300', '380', '270', 'wdg', '350', '380']
a = [x for x in a if x != 'wdg']
答案 2 :(得分:1)
要删除元素,您可以执行以下操作:
>>> a = ['a', 'b', 'c', 'd']
>>> a.remove('b')
>>> print a
['a', 'c', 'd']
发生此错误是因为您要遍历一系列数字-列表的原始大小。列表缩小后,索引将不再存在。我建议对列表中的元素进行迭代:
for elem in my_list:
print(elem)
代替:
for i in len(range(my_list)):
print(my_list[i])
答案 3 :(得分:1)
由于您在for循环之前测量了列表长度 ,并且在for循环中删除了 项,因此len(list)
在迭代过程中会出错。这就是为什么您超出范围。一种简单的方法是对列表反向进行迭代,例如for i in reversed(range(len(mylist)))
。这样,在删除元素时,它不会影响其余(先前)的元素。
但是,如其他用户所指出的那样,使用列表理解会更好。