[英]Remove elements from a list according to indexes list efficiently
我有两个非常大的整数列表: list1
和list2
。
在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]
我假设您有效地使用了时间复杂度。 让我们将n
和m
命名为list1
和list2
的大小。
您的解决方案似乎是最好的选择,但未提供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.