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

MrP*_*MrP 7 python list binary-search

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

问题:

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

示例代码尝试:

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
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 10

  1. 你使用的bisect.insort()功能:

    bisect.insort(L, X)
    
    Run Code Online (Sandbox Code Playgroud)
  2. L.remove(X)将扫描整个列表,直到找到X.del L[bisect.bisect_left(L, X)]改为使用(假设X确实存在L).

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

  • 来自文档:请记住,`O(log n)` 搜索是由缓慢的 `O(n)` 插入步骤主导的。所以,`insort` 实际上是 `O(N)`。 (2认同)