0

我不确定为什么我的列表没有删除基于第二个列表索引的每个字符。下面是代码:

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]

以下是我得到的错误:

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

谢谢你的帮助 ....

4

3 回答 3

5

当您删除较早的项目时,列表会变短,因此后面的索引不存在。这是在 Python 中按索引进行迭代的症状——这是一个糟糕的主意。这不是 Python 的设计方式,并且通常会生成不可读、缓慢、不灵活的代码。

相反,使用列表推导来构造一个新列表:

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

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

于 2013-04-05T19:45:24.977 回答
2

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

>>> items = ['a', 'b', 'c', 'd']
>>> len(items)
4
>>> items[1]
'b'
>>> del items[1]
>>> items[1]
'c'
>>> len(items)
3

导致您的错误的原因是当您删除该项目时列表的 被更改,但是,这len不会更新循环正在处理的 。rangefor

此外,如果您删除一个元素然后增加索引,实际上就好像您将索引增加了 2,因为所有内容都会向左移动一个索引。

对此的最佳解决方案是 Lattyware 建议的列表理解。您的 for 循环可以替换为

L1 = [item for item in L1 if item not in L2]
于 2013-04-05T19:53:45.780 回答
1

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

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)给出:[]

于 2013-04-05T19:50:45.890 回答