根据索引列表有效地从列表中删除元素

时间:2016-03-09 12:48:00

标签: python arrays algorithm

我有两个非常大的整数列表:list1list2

list1我的索引为list2(有些无效),我需要从list2中删除这些索引中的元素。

这是我的代码:

for index in list1:
    if index >= 0 and index < len(list2):  # verify index is valid
        list2.pop(index)

这是有效的,但我希望有一个比这更快的解决方案。可能吗?也许使用numpy

2 个答案:

答案 0 :(得分:4)

编辑:我刚刚注意到这个答案实际上是Andy所要求的,它会删除list2中的索引为的项目list1。我将把它留在这里,万一有人试图这样做会遇到这个问题,但要注意以下是解决Andy的查询;为此,请看看Salva的答案。

原始答案:

这是一个使用列表推导的解决方案(并且还避免在每次迭代时检查list2的长度):

list2_length = len(list2)

list2 = [list2[index] for index in list1 if index > 0 and index < list2_length]

答案 1 :(得分:1)

我假设您使用有效地引用时间复杂性。我们将nm命名为list1list2的大小。

你的解决方案似乎是最好的选择,但它没有给出.pop() operates in O(m)所以它需要O(n * m)。

没有更多信息,列表推导解决方案通常是个坏主意,因为您应该测试索引是否在list1内,即O(n)。所以解决方案:

filtered = [item for index, item in enumerate(list2) if index not in list1]

也在O(n * m)中执行。

但如果in是一组,那么你可以将list1操作设为O(1)。如果你这样做,这个集合的构造是O(n):

ignore_indices = { index for index in list1 if 0 < index < len(list2) }

现在您可以构建另一个过滤列表,忽略此集合中的位置:

filtered = [item for index, item in enumerate(list2) if index not in ignore_indices]

然后运行O(m),因此最终的复杂度在O(n + m)。

顺便说一下,我认为您的验证检查是0 <= index < len(list2),但我不确定您是否故意排除0。