繁体   English   中英

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

[英]Remove elements from a list according to indexes list efficiently

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

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

这是我的代码:

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

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

编辑 :我刚刚注意到,这个答案实际上与Andy的要求相反 ,它删除了list2索引不在 list1 如果有人尝试这样做,我将把它留在这里,但是要知道,接下来的事情并不是 Andy查询的解决方案; 为此,请查看Salva的答案。

原始答案:

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

list2_length = len(list2)

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

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

您的解决方案似乎是最好的选择,但未提供Python .pop()在O(m)中运行,因此需要O(n * m)。

在没有更多信息的情况下,列表理解解决方案通常不是一个好主意,因为您应该测试index是否在list1 ,即O(n)。 所以解决方案:

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

也执行O(n * m)。

但是,你能有这样in操作是O(1)如果list1是一个集合。 如果您这样做,则此集合的构造为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。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM