我有一个这样的清单:
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])
但是我得到的列表索引超出范围错误,并且不知道如何解决这个问题 任何人都可以帮忙解决这个问题吗?
答案 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