删除多个元素而不更新直到结束

时间:2013-04-24 19:16:03

标签: python list

我有两个清单:

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

4 个答案:

答案 0 :(得分:9)

两个选项:

  • 使用列表推导创建新列表:

    newlist = [el for i, el in enumerate(oldlist) if i not in indices_to_delete]
    

    如果indices_to_deleteset

    ,这将会更快
    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

在此处运行代码http://codebunk.com/bunk#-Isxeb4TZOHBCvQi4EsY