insort是bisect模块用于有序插入的函数,示例中bisect.insort(nums, 4)将4插入[1,3,5,7]保持升序得[1,3,4,5,7];insort为insort_right别名,插入相等值右侧,insort_left插左侧,两者在处理重复值时位置不同但输出看似相同;适用于需频繁插入维持有序的场景如简化优先队列,注意列表须预排序,插入复杂度O(n),查找O(log n),大数据宜用堆优化。

在Python中,insort 是 bisect 模块提供的函数,用于将元素插入已排序的列表中,同时保持列表的升序排列。它比手动排序更高效,特别适用于需要频繁插入并维持有序的场景。
insort 函数的基本用法
bisect.insort(list, item) 将 item 插入到有序列表 list 中,自动找到合适位置,确保插入后列表仍有序。
示例:
import bisectnums = [1, 3, 5, 7] bisect.insort(nums, 4) print(nums) # 输出: [1, 3, 4, 5, 7]
插入 4 后,列表依然保持升序。不需要自己调用 sort(),效率更高。
立即学习“Python免费学习笔记(深入)”;
insort_left 和 insort_right 的区别
insort 实际是 insort_right 的别名。两者都插入到相等元素的右侧,而 insort_left 插入到左侧。
当插入值与现有元素相等时,行为略有不同:
- insort_left:插入到相同值的前面
- insort_right(即 insort):插入到相同值的后面
示例:
import bisectarr = [2, 4, 4, 6]
bisect.insort_left(arr, 4) print(arr) # [2, 4, 4, 4, 6] —— 插在两个4之间或前面
arr2 = [2, 4, 4, 6] bisect.insort_right(arr2, 4) print(arr2) # [2, 4, 4, 4, 6] —— 插在最后面的4之后
实际输出看起来一样,但在记录插入顺序或索引敏感场景中会有影响。
适用场景和注意事项
适合维护一个动态有序列表,比如优先队列的简化实现、实时数据插入等。
注意点:
- 输入列表必须是已经排序的,否则结果可能出错
- 插入操作时间复杂度为 O(n),因为要移动元素,但查找插入点是 O(log n)
- 对于大量数据,考虑使用堆(heapq)或其他数据结构更高效
基本上就这些。insort 简单实用,适合中小规模有序插入需求。不复杂但容易忽略细节,比如 left 和 right 的区别。用对了能省去手动排序的麻烦。











