我有两个清单:
list_a = [1,5,8]
list_b = [12,4,2,5,7,5,3,6,8]
list_a
中的元素对应list_b
中元素的索引。两个列表的大小都大于100。
如何删除索引位于list_b
的{{1}}元素,
因此,如果您获取上面的列表,结果列表为list_a
?
答案 0 :(得分:9)
两个选项:
使用列表推导创建新列表:
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)与O(n)。
从列表中就地按反向排序顺序删除索引:
for index in sorted(indices_to_delete, reversed=True):
del oldlist[index]
如果不以反向排序顺序删除项目,则会删除索引较高的项目,因为删除了较低索引的项目,而indices_to_delete
的其余项目不再匹配您需要删除的项目。
答案 1 :(得分:4)
这应该实现:
for delidx in reversed(toDelete):
del otherList[delidx]
另外,使用列表理解:
l2 = [elem for i, elem in enumerate(l1) if i not in toDelete]
答案 2 :(得分:2)
现在我明白了这个问题
a = numpy.array(list2)
mask = [True]*len(a)
mask[list1] = False
print a[mask]
答案 3 :(得分:0)
好的,这是一个稍微过度设计的解决方案,但这里是
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