我有两个非常大的整数列表:list1
和list2
。
在list1
我的索引为list2
(有些无效),我需要从list2
中删除这些索引中的元素。
这是我的代码:
for index in list1:
if index >= 0 and index < len(list2): # verify index is valid
list2.pop(index)
这是有效的,但我希望有一个比这更快的解决方案。可能吗?也许使用numpy
?
答案 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)
我假设您使用有效地引用时间复杂性。我们将n
和m
命名为list1
和list2
的大小。
你的解决方案似乎是最好的选择,但它没有给出.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。