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

Python 尝试删除列表元素时获取索引超出范围错误,python,list,indexing,range,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]) 但是,我得到了一个列表索引超出范围的错误,不知道如何修复此错误。 有人能帮忙解决这个问题吗?在迭代时,千万不要在结构上操纵列表!使

我有这样一份清单:

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])
但是,我得到了一个列表索引超出范围的错误,不知道如何修复此错误。

有人能帮忙解决这个问题吗?

在迭代时,千万不要在结构上操纵
列表
!使用条件理解

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


在迭代时,切勿在结构上操纵
列表
!使用条件理解

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

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”
的元素,那么您可能希望将这些项目添加到新列表中

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)
使用不同的方法玩得开心。

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”
的元素,那么您可能希望将这些项目添加到新列表中

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)
玩各种不同的方法玩得开心。

问题是
len(l)
返回
3
,但是一旦你弹出一个项目,你的列表就会变短。最简单的方法是(假设你的列表不是令人望而却步的巨大)写一个新的列表:

l_new = [i for i in l if "a" in i]
问题是
len(l)
返回
3
,但一旦弹出项目,列表就会变短。最简单的方法是(假设你的列表不是令人望而却步的巨大)写一个新的列表:

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

如果您不想创建一个新的
列表
,并使用
弹出按钮保持您的逻辑
,则每次都必须检查
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
l=['(7-3)'、'7-6'、'(a+13)]
i=0
而我

但是,正如其他人所要求的那样,最好创建一个新的具有列表理解功能的
列表
,如果您不想创建一个新的
列表
,并使用
弹出按钮保持您的逻辑,那么您每次都必须检查
len(l)
,您可以通过以下方式完成:

l = [x for x in l if 'a' in x]
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
l=['(7-3)'、'7-6'、'(a+13)]
i=0
而我

但正如其他人所要求的那样,最好使用列表理解功能创建一个新的
列表

当您从列表中弹出一个元素时,您会减小列表的大小,而for循环保持原有的长度。我建议使用第二个列表从中弹出。我建议使用一种新方法,创建一个新的列表和确实包含“a”的.append()项:new=[]#您在currentlist:I:new.append(I)中使用“l”表示“currentlist”中的“I”如果“a”当您从列表中弹出一个元素时,您会减小列表的大小,而for循环保持原有的长度。我建议使用第二个列表从中弹出。我建议使用一种新方法,创建一个新的列表和确实包含“a”的.append()项:new=[]#您在currentlist:I:new.append(I)中使用“l”表示“currentlist”中的“I”如果“a”
l = [x for x in l if 'a' in x]