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

时间:2013-04-05 19:44:15

标签: python list

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

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

感谢您的帮助......

3 个答案:

答案 0 :(得分:5)

当您删除之前的项目时,列表会变短,因此后面的标记不存在。这是Python中索引迭代的一个症状 - 这是一个糟糕的主意。这不是Python的设计方式,通常会产生难以理解,缓慢,不灵活的代码。

相反,使用list comprehension构建新列表:

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

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

答案 1 :(得分:2)

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

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

导致错误的是,当您删除项目时,列表的len会发生更改,但是,这不会更新range循环正在运行的for

此外,如果你删除一个元素然后增加索引,那就好像你将索引增加2,因为所有东西都被一个索引左移。

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

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

答案 2 :(得分: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)提供:[]