首页 > 编程语言 > 详细

python基础 有序序列 二分查找 bisect

时间:2020-04-13 00:05:03      阅读:93      评论:0      收藏:0      [点我收藏+]
 1 import bisect
 2 """
 3 bisect.bisect_left(a, x, lo=0, hi=len(a))
 4 在 a 中找到 x 合适的插入点以维持有序。参数 lo 和 hi 可以被用于确定需要考虑的子集;默认情况下整个列表都会被使用。如果 x 已经在 a 里存在,那么插入点会在已存在元素之前(也就是左边)。如果 a 是列表(list)的话,返回值是可以被放在 list.insert() 的第一个参数的。
 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]
 9 print(bisect.bisect_left(list_orderd, 8), list_orderd) #5 [1, 2, 3, 4, 7, 9, 10, 10, 22, 45] 返回8插入的索引值,如果list_order里面已经有8则返回其左边的索引值,源列表不会变化
10 print(bisect.bisect_left(list_normal, 8), list_normal)#10 [1, 2, 99, 34, 3, 7, 5, 7, 4, 2] 由于bisect使用二分法查找,其前提是序列本身有序,如对无序序列使用此方法结果将不可预期
11 
12 """
13 bisect.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 """
16 print(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()
20 print(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])
24 print(data) #有规律的嵌套容器类型排序方法
25 keys = [r[1] for r in data]
26 print(keys) #[0, 1, 5, 8] 可以对此序列使用bisect方法
27 
28 #bisect还能用于数字表的查询,示例如下。从一个给定的考试成绩集合里,通过一个有序数字表,查出其对应的字母等级:90 分及以上是 ‘A‘,80 到 89 是 ‘B‘,以此类推
29 def grade(score, breakpoints=[60, 70, 80, 90], grades=FDCBA):
30     i = bisect.bisect(breakpoints, score)
31     return grades[i]
32 print([grade(score) for score in [33, 99, 77, 70, 89, 90, 100]]) #[‘F‘, ‘A‘, ‘C‘, ‘C‘, ‘B‘, ‘A‘, ‘A‘]
33 
34 """
35 利用下面函数可以将bisect利用修改为查找元素大小的函数
36 def 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
41     raise ValueError
42 
43 def 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 
50 def 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 
57 def 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 
64 def 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 """

 

python基础 有序序列 二分查找 bisect

原文:https://www.cnblogs.com/flags-blog/p/12688515.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!