如何从列表中删除索引超出范围错误的项目?

时间:2018-05-31 07:10:20

标签: python python-3.x list

a = [[' 0 ', '*X*', '*Y*', '*Z*'], [' 0 ', '*X*', '*Y*', '*Z*'], [' 0 ', '*X*', '*Y*', '*Z*']]

for i in a:
    for j in i:
        if '*' in j:
            i.remove(j)


for i in range(len(a)):
    for j in range(len(a[i])):
        if '*' in a[i][j]:
            del a[i][j]

我尝试删除列表中包含star的项目,但第一个循环会让我超出范围错误,而第二个循环仍然会 y 不删除,我该如何修复问题?非常感谢你

3 个答案:

答案 0 :(得分:4)

你在迭代它时改变了数组。不要那样做。 而是使用列表推导(为Pythonic):

a = [
    [' 0 ', '*X*', '*Y*', '*Z*'],
    [' 0 ', '*X*', '*Y*', '*Z*'],
    [' 0 ', '*X*', '*Y*', '*Z*'],
]

a = [[e for e in l if '*' not in e] for l in a]

# >>> a
# [[' 0 '], [' 0 '], [' 0 ']]

如果由于某种原因你仍然需要改变a(即保持它引用相同的列表对象),你可以a[:] = ...而不是a = ...

答案 1 :(得分:0)

迭代同一个列表并更改其值,为您解决问题。

for i in a[:]:
    #      ^  Help to iterate over a copy of a 
    for j in i[:]:
        #      ^ Help to iterate over a copy of i
        if '*' in j:
            i.remove(j)

答案 2 :(得分:0)

列表理解可以返回您要查找的结果:

a = [[i] for j in a for i in j if '*' not in i]
print(a)

这是你的输出:

[[' 0 '], [' 0 '], [' 0 ']]

我们基本上运行for循环。所以我们列表中的[i]理解是我们将添加到列表中的值。该值将是您自己的代码中的嵌套列表。这就是为什么我们在它周围放置括号。因为你知道的只是a中的每个嵌套列表。然后我们进行条件测试' if' *'不在i中,如果占位符不在那里,它会将值添加到列表中。这应该可以解决您的问题,并大大简化您的代码。