搜索和删除列表中的项目时“列表索引超出范围”

时间:2018-08-16 16:37:37

标签: python

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”并将其删除

4 个答案:

答案 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)))。这样,在删除元素时,它不会影响其余(先前)的元素。

但是,如其他用户所指出的那样,使用列表理解会更好。