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 模块提供的函数
,用于将元素插入已排序的列表中,同时保持列表的升序排列。它比手动排序更高效,特别适用于需要频繁插入并维持有序的场景。
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(),效率更高。
insort 实际是 insort_right 的别名。两者都插入到相等元素的右侧,而 insort_left 插入到左侧。
当插入值与现有元素相等时,行为略有不同:
示例:
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之后
实际输出看起来一样,但在记录插入顺序或索引敏感场景中会有影响。
适合维护一个动态有序列表,比如优先队列的简化实现、实时数据插入等。
注意点:
基本上就这些。insort 简单实用,适合中小规模有序插入需求。不复杂但容易忽略细节,比如 left 和 right 的区别。用对了能省去手动排序的麻烦。