我有一个清单L.
我可以删除元素i:
del L[i]
Run Code Online (Sandbox Code Playgroud)
但是,如果我有一组不连续的索引要删除怎么办?
I=set([i1, i2, i3,...])
Run Code Online (Sandbox Code Playgroud)
这样做:
for i in I:
del L[i]
Run Code Online (Sandbox Code Playgroud)
不行.
有任何想法吗?
Pau*_*McG 32
Eine Minuten bitte,Ich hap eine kleine Problemo avec diese Religione. - Eddie Izzard(对Martin Luther的印象)
通过对列表进行反向迭代来删除以保留迭代器是此问题的常见解决方案.但另一种解决方案是将其改为另一个问题.不是使用某些条件从列表中删除项目(在您的情况下,索引存在于要删除的索引列表中),而是创建一个新的列表,其中不包含有问题的项目.
L[:] = [ item for i,item in enumerate(L) if i not in I ]
Run Code Online (Sandbox Code Playgroud)
就此而言,你I首先在哪里提出索引?您可以结合获取要删除的索引和构建新列表的逻辑.假设这是一个对象列表,您只想保留那些通过isValid测试的对象:
L[:] = [ item for item in L if item.isValid() ]
Run Code Online (Sandbox Code Playgroud)
这比直截了当简单得多:
I = set()
for i in range(len(L)):
if not L[i].isValid():
I.add(i)
for i in sorted(I, reverse=True):
del L[i]
Run Code Online (Sandbox Code Playgroud)
在大多数情况下,我将有关"如何从列表中删除我不想要的项目"的任何问题转变为"如何创建仅包含我想要的项目的新列表".
编辑:根据Alex Martelli对这个问题的回答,将"L = ......"更改为"L [:] = ..." .
for i in I:
del L[i]
Run Code Online (Sandbox Code Playgroud)
将无效,因为(取决于顺序)您可能使迭代器无效 - 这通常会显示为您要删除的一些项目保留在列表中.
按照索引的相反顺序从列表中删除项目总是安全的.最简单的方法是使用sorted():
for i in sorted(I, reverse=True):
del L[i]
Run Code Online (Sandbox Code Playgroud)