第2章:序列构成的数组-用 bisect 模块来管理已排序的序列

bisect 模块包含两个主要函数,bisect 和 insort,两个函数都利用二分查找算法来在有序序列中查找或插入元素。

 2.8.1 用 bisect 来搜索

bisect 用来搜索 x 在假设插入序列 n 后,然后再对 n 排序之后的索引位置,实际上 x 并不在 n 中;

bisect(n, x) 有2个必须参数:

  • n : 被搜索的序列;
  • x : 要搜索的对象;
from bisect import bisect

n = [3, 1, 4, 2, 8, 6]  # 模拟排序后的结果 [1, 2, 3, 4, 6, 8]
x = bisect(n, 5)  # 模拟插入后 5 的索引 [1, 2, 3, 4, 5, 6, 8]
print(x)  # 4,x 可能会出现的索引位置为 4

如果 xn 中有重复,则默认索引位置是在最右侧相同值的右侧,也就是相同值中的最后面:

from bisect import bisect

n = ['c', 'b', 'e', 'z', 'f', 'b']  # 模拟排序后的结果 ['b', 'b', 'c', 'e', 'f', 'z']
y = bisect(n, 'b')  # # 模拟插入后 'b' 的索引 ['b', 'b', 'b', 'c', 'e', 'f', 'z']
print(y)  # 2, y 可能会出现的索引位置为 2

bisect_left 则恰恰相反,如果 xn 中有重复,则默认索引位置是在最左侧相同值的左侧,也就是相同值中的最前面:

from bisect import bisect_left

n = ['c', 'b', 'e', 'z', 'f', 'b']  # 模拟排序后的结果 ['b', 'b', 'c', 'e', 'f', 'z']
y = bisect_left(n, 'b')  # # 模拟插入后 'b' 的索引 ['b', 'b', 'b', 'c', 'e', 'f', 'z']
print(y)  # 0, y 可能会出现的索引位置为 0

2.8.2 用 insort 插入新元素

排序很耗时,因此在得到一个有序序列之后,我们最好能够保持它的有序,bisect.insort 就是为了这个而存在的。

insort(n, x) 有2个必须参数:

  • n : 被插入的序列;
  • x : 要插入的对象;

假设 n 已经排序,在不破坏 n 的排序的情况下,将 x 插入 n 中:

from bisect import insort

t = [1, 3, 5, 7, 9]
insort(t, 6)
print(t)  # [1, 3, 5, 6, 7, 9]

 如果 xn 中有重复,则将 x 插入到相同值的最右侧:

t = [1, 3, 5, 7, 9]
insort(t, 5)
print(t)  # [1, 3, 5, 5, 7, 9]

insort_left 则恰恰相反,它是将 x 插入到相同值的最左侧;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值