我有一个整数的排序列表L,我有一个值X,我希望插入到列表中,以便维持L'的顺序。同样,我希望快速找到并删除X的第一个实例。
问题:
示例代码尝试:
i = bisect_left(L, y)
L.pop(i) #works
del L[bisect_left(L, i)] #doesn't work if I use this instead of pop
答案 0 :(得分:11)
bisect.insort(L, X)
L.remove(X)
将扫描整个列表,直至找到X
。请改用del L[bisect.bisect_left(L, X)]
(假设X
确实在L
中)。
请注意,从列表中间删除仍然会产生成本,因为从该位置开始的元素都必须向左移动一步。如果这将成为性能瓶颈,那么二叉树可能是更好的解决方案。
答案 1 :(得分:1)
你可以使用Raymond Hettinger的IndexableSkiplist。它在O(ln n)
时间执行3次操作:
import skiplist
import random
random.seed(2013)
N = 10
skip = skiplist.IndexableSkiplist(N)
data = range(N)
random.shuffle(data)
for num in data:
skip.insert(num)
print(list(skip))
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
for num in data[:N//2]:
skip.remove(num)
print(list(skip))
# [0, 3, 4, 6, 9]