我有两个列表:删除多个元素,而无需更新,直到结束
list_a = [1,5,8]
list_b = [12,4,2,5,7,5,3,6,8]
在list_a
的元素对应于在list_b
元素的索引。这两个名单是尺寸小于100
更大的如何删除的list_b
,其指数在list_a
元素, 所以如果你把结果列表上面的列表是[12,2,5,7,3,6]
?
我有两个列表:删除多个元素,而无需更新,直到结束
list_a = [1,5,8]
list_b = [12,4,2,5,7,5,3,6,8]
在list_a
的元素对应于在list_b
元素的索引。这两个名单是尺寸小于100
更大的如何删除的list_b
,其指数在list_a
元素, 所以如果你把结果列表上面的列表是[12,2,5,7,3,6]
?
两个选项:
与列表理解创建一个新的列表:
newlist = [el for i, el in enumerate(oldlist) if i not in indices_to_delete]
这将是所有的更快,如果indices_to_delete
是set
:
indices_to_delete = set(indices_to_delete)
newlist = [el for i, el in enumerate(oldlist) if i not in indices_to_delete]
,因为在一组成员资格测试是O(1)VS O(n)列表中。
从列表中删除反向排序顺序指数就地:
for index in sorted(indices_to_delete, reversed=True):
del oldlist[index]
如果不删除项目按相反的排序顺序,具有较高的指数项目上升为项目与较低的指数被删除,其余的indices_to_delete
不再匹配您需要删除的项目。
这应该做到的是:
for delidx in reversed(toDelete):
del otherList[delidx]
此外,使用列表理解:
l2 = [elem for i, elem in enumerate(l1) if i not in toDelete]
刚一说明: toDelete应该先排序。 – 2013-04-24 19:18:57
它被排序在问题中,是我没有包括它的唯一原因,但是,这是非常好的一点。 – 2013-04-24 19:19:18
哦,对不起,我看了一下错误的列表。 – 2013-04-24 19:20:02
现在我明白的问题
a = numpy.array(list2)
mask = [True]*len(a)
mask[list1] = False
print a[mask]
IIUC OP想要删除由list1索引的元素*。 – DSM 2013-04-24 19:19:23
啊阅读理解失败...(就我而言)...认为它应该现在工作:/ – 2013-04-24 19:19:56
好吧,这稍微过度设计的解决方案,但在这里它是
def get_newl(li, index):
index = sorted(index, reverse=True)
i=0
while i < (len(li)-len(index)):
x = index.pop()
while i < x:
yield li[i]
i+=1
i+=1
这是一个错误,谢谢你告诉我 – 2013-04-24 19:18:12