在Python中插入和删除排序列表

时间:2013-06-27 16:21:54

标签: python list binary-search

我有一个整数的排序列表L,我有一个值X,我希望插入到列表中,以便维持L'的顺序。同样,我希望快速找到并删除X的第一个实例。

问题:

  1. 如果可能,如何使用bisect模块执行第一部分?
  2. L.remove(X)是第二部分最有效的方法吗? Python是否检测到列表已经排序并自动使用对数删除过程?
  3. 示例代码尝试:

    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
    

2 个答案:

答案 0 :(得分:11)

  1. 您使用bisect.insort() function

    bisect.insort(L, X)
    
  2. L.remove(X)将扫描整个列表,直至找到X。请改用del L[bisect.bisect_left(L, X)](假设X确实在L中)。

  3. 请注意,从列表中间删除仍然会产生成本,因为从该位置开始的元素都必须向左移动一步。如果这将成为性能瓶颈,那么二叉树可能是更好的解决方案。

答案 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]