Python中冷门但好用的库/函数(不定期更新)

一、deque

deque(双端队列)是 Python 的 collections 模块中提供的一种高效的数据结构,支持从两端快速添加和删除元素。它的全称是“Double Ended Queue”,即双端队列。

from collections import deque

# 创建一个 deque
dq = deque([1, 2, 3], maxlen=5)

# 添加元素
dq.append(4)  # 右侧添加
dq.appendleft(0)  # 左侧添加
print(dq)  # 输出: deque([0, 1, 2, 3, 4], maxlen=5)

# 删除元素
right_element = dq.pop()  # 右侧移除
left_element = dq.popleft()  # 左侧移除
print(dq)  # 输出: deque([1, 2, 3], maxlen=5)

# 添加多个元素
dq.extend([5, 6])  # 右侧添加多个元素
dq.extendleft([-1, -2])  # 左侧添加多个元素
print(dq)  # 输出: deque([-2, -1, 1, 2, 3], maxlen=5)

# 旋转元素
dq.rotate(2)  # 向右旋转 2 步
print(dq)  # 输出: deque([2, 3, -2, -1, 1], maxlen=5)
dq.rotate(-2)  # 向左旋转 2 步
print(dq)  # 输出: deque([-2, -1, 1, 2, 3], maxlen=5)

二、bisect

bisect 是 Python 的一个标准库模块,主要用于对有序列表进行二分查找和插入操作。它提供了高效的算法来处理有序序列,常用于需要快速查找、插入或维护有序数据的场景。

 bisect.bisect_left(a, x, lo=0, hi=len(a))——升

返回 x 应该插入的位置索引。如果 x 已经存在于列表中,返回第一个等于 x 的元素的索引。

bisect.bisect_right(a, x, lo=0, hi=len(a))——降

返回 x 应该插入的位置索引。如果 x 已经存在于列表中,返回最后一个等于 x 的元素的下一个位置。

  • a:有序列表。

  • x:要查找或插入的元素。

  • lo:查找的起始位置,默认为 0。

  • hi:查找的结束位置,默认为 len(a)

bisect.insort_left(a, x, lo=0, hi=len(a))
bisect.insort_right(a, x, lo=0, hi=len(a))
import bisect

# 示例列表
a = [1, 3, 4, 4, 6, 8]

# 使用 bisect_left 查找插入位置
x = 4
index_left = bisect.bisect_left(a, x)
print(f"bisect_left: {x} 应该插入的位置是 {index_left}")  # 输出: bisect_left: 4 应该插入的位置是 2

# 使用 bisect_right 查找插入位置
index_right = bisect.bisect_right(a, x)
print(f"bisect_right: {x} 应该插入的位置是 {index_right}")  # 输出: bisect_right: 4 应该插入的位置是 4

# 使用 insort_left 插入元素
bisect.insort_left(a, 5)
print(f"insort_left: 插入 5 后的列表是 {a}")  # 输出: insort_left: 插入 5 后的列表是 [1, 3, 4, 4, 5, 6, 8]

# 使用 insort_right 插入元素
bisect.insort_right(a, 4)
print(f"insort_right: 插入 4 后的列表是 {a}")  # 输出: insort_right: 插入 4 后的列表是 [1, 3, 4, 4, 4, 5, 6, 8]

注意事项

  • bisect 模块假设输入的列表 a 是有序的。如果列表未排序,使用 bisect 函数可能会导致错误的结果。

  • 如果需要对列表进行排序,可以使用 sorted()list.sort() 方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值