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]

4

4 回答 4

9

两种选择:

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

    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不再与您需要删除的项目匹配。

于 2013-04-24T19:18:59.917 回答
4

这应该实现:

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

此外,使用列表推导:

l2 = [elem for i, elem in enumerate(l1) if i not in toDelete]
于 2013-04-24T19:18:23.600 回答
2

现在我明白了这个问题

a = numpy.array(list2)
mask = [True]*len(a)
mask[list1] = False
print a[mask]
于 2013-04-24T19:18:32.027 回答
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

于 2013-04-24T20:13:53.120 回答