尝试删除列表元素时,索引超出范围错误

时间:2017-02-15 17:12:54

标签: python list indexing range

我有一个这样的清单:

l = ['(7 - 3)', '7 - 6', '(a + 13)']

我想删除任何不包含字母"a"的表达式,因此唯一剩下的表达式是['(a+13)']。 到目前为止,我已经尝试过这个:

for i in range(len(l)):
    if "a" not in l[i]:
        l.pop(i)
else:
    print(l[i])

但是我得到的列表索引超出范围错误,并且不知道如何解决这个问题 任何人都可以帮忙解决这个问题吗?

4 个答案:

答案 0 :(得分:3)

l.pop()从列表中删除元素,因此您的列表越来越小,但您没有调整迭代。

>>> x = [1,2,3]
>>> x.pop(0)
1
>>> x
[2, 3]
>>> x.pop(1)
3
>>> x
[2]
>>> x.pop(2)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: pop index out of range

我建议你采取不同的方法。您可以直接遍历列表中的元素并打印其中包含"a"的元素。

for i in l:
  if "a" in i:
     print(i)

如果您需要列表在迭代结束时只包含"a"个元素,可能您希望这些项添加到新列表中。< / p>

things_with_a_in_them = []
for i in l:
  if "a" in i:
    things_with_a_in_them.append(i)
    print(i)

如果你想要它更像......

things_with_a_in_them = [i for i in l if "a" in i]
map(print, things_with_a_in_them)

玩弄不同的方法玩得很开心。

答案 1 :(得分:1)

在迭代它时,永远不要在结构上操纵list!使用条件理解

l = [x for x in l if 'a' in x]

filter

l = filter(lambda x: 'a' in x, l)
# in Python3, you will have to convert the filter object to a list
# l = list(filter(lambda x: 'a' in x, l)) 

答案 2 :(得分:1)

问题是len(l)返回3,但只要您弹出一个项目,您的列表就会变短。最简单的事情(假设你的列表并不是非常庞大)就是写一个新列表:

l_new = [i for i in l if "a" in i]

答案 3 :(得分:0)

如果您不想创建新的list,并使用pop保持逻辑,则必须每次都检查len(l),您可以执行此操作通过:

l = ['(7 - 3)', '7 - 6', '(a + 13)']

i = 0
while i < len(l):
    if "a" not in l[i]:
        l.pop(i)
    else:
        print(l[i])
        i += 1

但是,正如其他人已经回答的那样,最好使用列表理解来创建新的list