2013-04-24 44 views
3

我有两个列表:删除多个元素,而无需更新,直到结束

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]

+0

这是一个错误,谢谢你告诉我 – 2013-04-24 19:18:12

回答

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)VS O(n)列表中。

  • 从列表中删除反向排序顺序指数就地:

    for index in sorted(indices_to_delete, reversed=True): 
        del oldlist[index] 
    

    如果删除项目按相反的排序顺序,具有较高的指数项目上升为项目与较低的指数被删除,其余的indices_to_delete不再匹配您需要删除的项目。

4

这应该做到的是:

for delidx in reversed(toDelete): 
    del otherList[delidx] 

此外,使用列表理解:

l2 = [elem for i, elem in enumerate(l1) if i not in toDelete] 
+2

刚一说明: toDelete应该先排序。 – 2013-04-24 19:18:57

+0

它被排序在问题中,是我没有包括它的唯一原因,但是,这是非常好的一点。 – 2013-04-24 19:19:18

+0

哦,对不起,我看了一下错误的列表。 – 2013-04-24 19:20:02

2

现在我明白的问题

a = numpy.array(list2) 
mask = [True]*len(a) 
mask[list1] = False 
print a[mask] 
+1

IIUC OP想要删除由list1索引的元素*。 – DSM 2013-04-24 19:19:23

+0

啊阅读理解失败...(就我而言)...认为它应该现在工作:/ – 2013-04-24 19:19:56

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