python基础有序序列二分查bisect

python基础有序序列⼆分查bisect
1import bisect
2"""
3bisect.bisect_left(a, x, lo=0, hi=len(a))
4在 a 中到 x 合适的插⼊点以维持有序。参数 lo 和 hi 可以被⽤于确定需要考虑的⼦集;默认情况下整个列表都会被使⽤。如果 x 已经在 a ⾥存在,那么插⼊点会在已存在元素之前(也就是左边)。如果 a 是列表(list)的话,返回值是可以被放 5返回的插⼊点 i 可以将数组 a 分成两部分。左侧是 all(val < x for val in a[lo:i]) ,右侧是 all(val >= x for val in a[i:hi]) 。bisect_right与其类似
6"""
7 list_orderd = [1, 2, 3, 4, 7, 9, 10, 10, 22, 45]
8 list_normal = [1, 2, 99, 34, 3, 7, 5, 7, 4, 2]
9print(bisect.bisect_left(list_orderd, 8), list_orderd) #5 [1, 2, 3, 4, 7, 9, 10, 10, 22, 45] 返回8插⼊的索引值,如果list_order⾥⾯已经有8则返回其左边的索引值,源列表不会变化
10print(bisect.bisect_left(list_normal, 8), list_normal)#10 [1, 2, 99, 34, 3, 7, 5, 7, 4, 2] 由于bisect使⽤⼆分法查,其前提是序列本⾝有序,如对⽆序序列使⽤此⽅法结果将不可预期
11
12"""
13bisect.insort_left(a, x, lo=0, hi=len(a))
14将 x 插⼊到⼀个有序序列 a ⾥,并维持其有序。如果 a 有序的话,这相当于 a.insert(bisect.bisect_left(a, x, lo, hi), x)。要注意搜索是 O(log n) 的,插⼊却是 O(n) 的;right⽅法类似
15"""
16print(bisect.insort_left(list_orderd, 8), list_orderd) #None [1, 2, 3, 4, 7, 8, 9, 10, 10, 22, 45] 该⽅法返回值为None,直接修改源列表
17
18#对于⽆序序列可以使⽤sort⽅法对其进⾏排序,排序以后就可以使⽤bisect⽅法了,sort⽅法使⽤
19 list_normal.sort()
20print(list_normal) #[1, 2, 2, 3, 4, 5, 7, 7, 34, 99]
21
22 data = [('red', 5), ('blue', 1), ('yellow', 8), ('black', 0)]
23 data.sort(key=lambda r: r[1])
24print(data) #有规律的嵌套容器类型排序⽅法
25 keys = [r[1] for r in data]
26print(keys) #[0, 1, 5, 8] 可以对此序列使⽤bisect⽅法
27
28#bisect还能⽤于数字表的查询,⽰例如下。从⼀个给定的考试成绩集合⾥,通过⼀个有序数字表,查出其对应的字母等级:90 分及以上是 'A',80 到 89 是 'B',以此类推
29def grade(score, breakpoints=[60, 70, 80, 90], grades='FDCBA'):
30    i = bisect.bisect(breakpoints, score)
31return grades[i]
32print([grade(score) for score in [33, 99, 77, 70, 89, 90, 100]]) #['F', 'A', 'C', 'C', 'B', 'A', 'A']
33
34"""
35利⽤下⾯函数可以将bisect利⽤修改为查元素⼤⼩的函数
36def index(a, x):
37    'Locate the leftmost value exactly equal to x'
38    i = bisect_left(a, x)
39    if i != len(a) and a[i] == x:
40        return i
hbs>载体蛋白
《保安服务管理条例》41    raise ValueError
42
43def find_lt(a, x):
44    'Find rightmost value less than x'
45    i = bisect_left(a, x)
46    if i:
47        return a[i-1]
48    raise ValueError
49
50def find_le(a, x):
51    'Find rightmost value less than or equal to x'
52    i = bisect_right(a, x)
53    if i:
54        return a[i-1]
55    raise ValueError
56
57def find_gt(a, x):
58    'Find leftmost value greater than x'
59    i = bisect_right(a, x)
三鹿奶粉60    if i != len(a):
美国药典
61        return a[i]
62    raise ValueError
63三羟甲基丙烷
64def find_ge(a, x):
65    'Find leftmost item greater than or equal to x'
66    i = bisect_left(a, x)
67    if i != len(a):
68        return a[i]
69    raise ValueError
70"""

本文发布于:2024-09-22 01:26:15,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/397801.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:有序   列表   序列   查找
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议