一、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()
方法。