关于python:我试图了解为什么我似乎无法使用循环删除列表中的每个索引

I'm trying to learn why I can't seem to delete every index in a list with a loop

本问题已经有最佳答案,请猛点这里访问。

我不知道为什么我的列表没有删除基于第二个列表索引的每个字符。代码如下:

1
2
3
4
5
6
L1 = ['e', 'i', 'l', 'n', 's', 't']
L2 = ['e', 'i', 'l', 'n', 's', 't']

for n_item in range(len(L1)):
    if L1[n_item] in L2:
     del L2[n_item]

下面是我得到的错误:

1
2
3
4
 Traceback (most recent call last):
 File"<pyshell#241>", line 3, in <module>
 del L2[n_item]
 IndexError: list assignment index out of range

谢谢你的帮助…


当您删除前面的项目时,列表会变短,因此后面的指标不存在。这是Python中按索引迭代的一个症状——这是一个糟糕的想法。这不是Python的设计方式,通常会使代码不可读、缓慢、不灵活。

相反,使用列表理解来构造新列表:

1
[item for item in L1 if item not in L2]

请注意,如果L2很大,则可能值得首先将其设置为集合,因为对集合的成员资格测试要快得多。


每次删除索引处的元素时,列表都会更改。

1
2
3
4
5
6
7
8
9
10
>>> items = ['a', 'b', 'c', 'd']
>>> len(items)
4
>>> items[1]
'b'
>>> del items[1]
>>> items[1]
'c'
>>> len(items)
3

造成您错误的原因是当您删除项目时,列表中的len发生了更改,但这不会更新for循环正在处理的range

另外,如果删除一个元素,然后增加索引,就好像增加了2个索引,因为所有内容都被一个索引左移了。

最好的解决办法是像拿铁一样理解清单。您的for循环可以替换为

1
L1 = [item for item in L1 if item not in L2]


如果您只关心从列表中删除特定值(而不关心索引、顺序等):

1
2
3
4
5
6
7
8
L1 = ['e', 'i', 'l', 'n', 's', 't']
L2 = ['e', 'i', 'l', 'n', 's', 't']

for item in L1:
    try:
        L2.remove(item)
    except ValueError:
        pass

print(L2)给出:[]