【流畅的python】02-用 bisect 来管理已排序的序列

本文详细介绍了Python标准库中的bisect模块,包括bisect和insort函数的使用方法,以及如何利用这些函数进行高效的数据查找和插入操作。通过具体实例展示了如何在有序序列中查找元素的插入位置,以及如何根据分数确定成绩等级。
原创《流畅的python》

bisect 模块包含两个主要函数, bisectinsort ,两个函数都利用二分查找算法来在有序序列中查找或插入元素。
并且是稳定排序

  1. 在有序序列中用 bisect 查找某个元素的插入位置
import bisect
import sys
HAYSTACK = [1, 4, 5, 6, 8, 12, 15, 20, 21, 23, 23, 26, 29, 30]
NEEDLES = [0, 1, 2, 5, 8, 10, 22, 23, 29, 30, 31]
ROW_FMT = '{0:2d} @ {1:2d} {2}{0:<2d}'
def demo(bisect_fn):
	for needle in reversed(NEEDLES):
	position = bisect_fn(HAYSTACK, needle)  # 用特定的 bisect 函数来计算元素应该出现的位置 
	offset = position * ' |'  # 利用该位置来算出需要几个分隔符号
	print(ROW_FMT.format(needle, position, offset))  # 把元素和其应该出现的位置打印出来
	
if __name__ == '__main__':
	if sys.argv[-1] == 'left':  # 根据命令上最后一个参数来选用 bisect 函数
		bisect_fn = bisect.bisect_left
	else:
		bisect_fn = bisect.bisect
		
	print('DEMO:', bisect_fn.__name__)  # 把选定的函数在抬头打印出来
	print('haystack ->', ' '.join('%2d' % n for n in HAYSTACK))
	demo(bisect_fn)

在这里插入图片描述

bisect 函数其实是 bisect_right 函数的别名,后者还有个姊妹函数叫 bisect_left 。它们的区别在于, bisect_left 返回的插入位置是原序列中跟被插入元素相等的元素的位置,也就是新元素会被放置于它相等的元素的前面,而 bisect_right 返回的则是跟它相等的元素之后的位置。

  1. 根据一个分数,找到它所对应的成绩
import bisect

def grade(score, breakpoints=[60, 70, 80, 90], grades='FDCBA'):
    i = bisect.bisect(breakpoints, score)
    # print(i)
    return grades[i]


print([grade(score) for score in [33, 99, 77, 70, 89, 90, 100]])

在这里插入图片描述

  1. 用 bisect.insort 插入新元素
import bisect
import random

SIZE = 7

random.seed(1729)

my_list = list()

for i in range(SIZE):
    new_item = random.randrange(SIZE*2)
    bisect.insort(my_list, new_item)
    print("%2d  ->" % new_item, my_list)

在这里插入图片描述

以上方法不仅仅是对列表或者元组有效,还可以应用于几乎所有的序列类型
上。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值