我有两个清单:
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
如果是 a ,这将更快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) 与列表中的 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]
现在我明白了这个问题
a = numpy.array(list2)
mask = [True]*len(a)
mask[list1] = False
print a[mask]
好的,这是一个稍微过度设计的解决方案,但在这里
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