Python bisect - array bisection library

本文介绍了Python内置模块bisect的功能及用法,包括如何利用bisect进行高效的元素插入操作,并通过示例展示了bisect_left、bisect_right及insort系列函数的具体应用。

Python的bisect模块是内置模块,bisect模块实现了一个算法用于插入元素到有序列表。

在一些情况下,这比反复排序列表或构造一个大的列表再排序的效率更高。Bisect是二分法的意思,这里使用二分法排序,将待插入的元素插入到合适的位置

 

bisect模块提供了如下几个函数:

(下面函数中的lo和hi用于指定列表的区间,默认的是整个列表)


bisect.bisect_left(a, x, lo=0, hi=len(a))   返回将x插入到列表a中的索引位置,如果已有x,则返回第一个x的位置

bisect.bisect_right(a, x, lo=0, hi=len(a)) 返回将x插入到列表a中的索引位置,如果已有x,则返回最后一个x位置的下一个位置

bisect.bisect(a, x, lo=0, hi=len(a))         与bisect_right相同

 

bisect.insort_left(a, x, lo=0, hi=len(a))   将x插入到列表a中,如果已有x,插入到所有x的最左边

bisect.insort_right(a, x, lo=0, hi=len(a)) 将x插入到列表a中,如果已有x,插入到所有x的最右边

bisect.insort(a, x, lo=0, hi=len(a))         与insort_right相同

 

下面看个例子:

[python]  view plain  copy
 print ?
  1. >>> import bisect  
  2. >>> import random  
  3. >>> mylist = list()  
  4. >>> for i in range(10):  
  5.         num = random.randint(1,100)  
  6.         index = bisect.bisect_left(mylist, num)  
  7.         bisect.insort_left(mylist, num)  
  8.         print('num  ', str(num), '\tindex  ', str(index), '\tlist ', mylist)  
  9.   
  10. num   37    index   0   list  [37]  
  11. num   31    index   0   list  [3137]  
  12. num   82    index   2   list  [313782]  
  13. num   27    index   0   list  [27313782]  
  14. num   62    index   3   list  [2731376282]  
  15. num   83    index   5   list  [273137628283]  
  16. num   83    index   5   list  [27313762828383]  
  17. num   87    index   7   list  [2731376282838387]  
  18. num   98    index   8   list  [273137628283838798]  
  19. num   99    index   9   list  [27313762828383879899]  
  20.   
  21. >>> mylist = list()  
  22. >>> for i in range(10):  
  23.         num = random.randint(1,100)  
  24.         index = bisect.bisect_right(mylist, num)  
  25.         bisect.insort_right(mylist, num)  
  26.         print('num  ', str(num), '\tindex  ', str(index), '\tlist ', mylist)  
  27.   
  28. num   85    index   0   list  [85]  
  29. num   73    index   0   list  [7385]  
  30. num   82    index   1   list  [738285]  
  31. num   36    index   0   list  [36738285]  
  32. num   80    index   2   list  [3673808285]  
  33. num   4     index   0   list  [43673808285]  
  34. num   79    index   3   list  [4367379808285]  
  35. num   6     index   1   list  [46367379808285]  
  36. num   64    index   3   list  [4636647379808285]  
  37. num   25    index   2   list  [462536647379808285]  
  38.   
  39. >>> mylist = list()  
  40. >>> for i in range(10):  
  41.         num = random.randint(1,100)  
  42.         index = bisect.bisect(mylist, num)  
  43.         bisect.insort(mylist, num)  
  44.         print('num  ', str(num), '\tindex  ', str(index), '\tlist ', mylist)  
  45.   
  46. num   25    index   0   list  [25]  
  47. num   28    index   1   list  [2528]  
  48. num   81    index   2   list  [252881]  
  49. num   9     index   0   list  [9252881]  
  50. num   29    index   3   list  [925282981]  
  51. num   66    index   4   list  [92528296681]  
  52. num   34    index   4   list  [9252829346681]  
  53. num   60    index   5   list  [925282934606681]  
  54. num   61    index   6   list  [92528293460616681]  
  55. num   3     index   0   list  [392528293460616681]  




评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值