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] |
请注意,如果
每次删除索引处的元素时,列表都会更改。
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 |
造成您错误的原因是当您删除项目时,列表中的
另外,如果删除一个元素,然后增加索引,就好像增加了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 |
号