Python bisect模块原理及常见实例

Ruby
Ruby
发布时间:2026-10-14 | 6人浏览过
原创

本文详细介绍Python内置bisect模块,涵盖bisect与insort函数的核心用法。通过有序列表查找、重复元素处理及成绩等级划分等场景,解析二分法在提升检索效率与简化逻辑判断中的实际应用,助力开发者掌握高效的数据处理技巧。

bisect模块概述

1. 模块介绍

bisect模块属于Python内置标准库,其核心功能是实现二分查找算法。在涉及二分查找的需求时,该模块通常是首选方案。

该模块主要提供两个关键函数:bisect用于查找元素在序列中的位置,insort用于将元素插入到有序序列中。

核心函数与查找场景

2. 常用方法介绍

场景1:已知一个有序列表,查找目标元素的位置索引


import bisect

# 已知一个有序序列
ordered_list = [23, 34, 59, 78, 99]

des_element = 21
res = bisect.bisect(ordered_list, des_element)
print(res) # res: 0

des_element = 35
res = bisect.bisect(ordered_list, des_element)
print(res) # res: 2

说明:bisect函数默认返回右侧的位置索引,同时bisect函数是bisect_right函数的别名。

场景2:已知一个有序列表,其中列表中有重复元素,查找目标元素的位置索引


import bisect

# 已知一个有序序列
ordered_list = [23, 34, 34, 59, 78, 99]

# bisect函数默认返回右侧的位置索引
des_element = 34
res = bisect.bisect(ordered_list, des_element)
print(res) # res: 3

# bisect函数为bisect_right函数的别名
des_element = 34
res = bisect.bisect_right(ordered_list, des_element)
print(res) # res: 3

# bisect_left函数默认返回左侧的位置索引
des_element = 34
res = bisect.bisect_left(ordered_list, des_element)
print(res) # res: 1

说明:如果目标元素会在已知有序列表中多次出现,那么目标元素从已知有序列表的左侧或右侧插入时结果是不同的。

实际应用场景

3. 场景应用

场景1:替代if-elif语句,例如:判断考生成绩所属的等级问题。


'''
  考试成绩的档位划分,共分为5个等级:
    1. F等级:[0, 60)
    2. D等级:[60, 70)
    3. C等级:[70, 80)
    4. B等级:[80, 90)
    5. A等级:[90, 100]
'''

import bisect


def get_result(score: (int, float), score_nodes: list = [60, 70, 80, 90], ranks='FDCBA') -> str:

  # 校验:分数范围
  if score < 0 or score >100:
    return "score的取值范围:0-100"

  # 边界点考虑
  if int(score) == 100:
    return "A"

  loc_index = bisect.bisect(score_nodes, score)
  return ranks[loc_index]

print(get_result(50))    # res: F
print(get_result(60))    # res: D
print(get_result(85.5))   # res: B
print(get_result(100))   # res: A

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表