一、什么是 deque(双端队列)?
deque(double-ended queue)是 Pythoncollections模块提供的高效双端队列数据结构。- 支持在队列两端 O(1) 时间复杂度的插入和删除,比列表(list)在头部插入/删除快得多。
- 适合实现队列、栈、滑动窗口等需要频繁头尾操作的场景。
二、deque 的常用方法
| 方法 | 作用描述 | 示例 |
|---|---|---|
| append(x) | 从尾部添加元素 x | d.append(10) |
| appendleft(x) | 从头部添加元素 x | d.appendleft(20) |
| pop() | 从尾部弹出并返回一个元素 | d.pop() |
| popleft() | 从头部弹出并返回一个元素 | d.popleft() |
| extend(iter) | 从尾部添加多个元素(可迭代对象) | d.extend([4, 5, 6]) |
| extendleft(iter) | 从头部添加多个元素(可迭代对象,逆序) | d.extendleft([7, 8]) |
| insert(i, x) | 在指定索引 i 处插入元素 x | d.insert(2, ‘a’) |
| rotate(n) | 将队列旋转 n 步(正数右移,负数左移) | d.rotate(1) |
你写的
append left应为appendleft,pop left应为popleft,extend left应为extendleft。
三、方法用法举例
from collections import deque
deque1 = deque(['hello', 'world', 1, 2, 3])
deque1.append(4) # ['hello', 'world', 1, 2, 3, 4]
deque1.appendleft(0) # [0, 'hello', 'world', 1, 2, 3, 4]
deque1.pop() # 弹出4,结果[0, 'hello', 'world', 1, 2, 3]
deque1.popleft() # 弹出0,结果['hello', 'world', 1, 2, 3]
deque1.extend([5, 6]) # ['hello', 'world', 1, 2, 3, 5, 6]
deque1.extendleft([-1, -2])# [-2, -1, 'hello', 'world', 1, 2, 3, 5, 6](注意顺序反转)
deque1.insert(2, 'python') # ['-2', '-1', 'python', 'hello', ...]
deque1.rotate(2) # 队列右移2步,尾部元素移到头部
四、deque 的优势和应用场景
- 高效的头尾操作:比 list 在头部插入/删除快得多。
- 适合实现:
- 队列(FIFO):用
append和popleft - 栈(LIFO):用
append和pop - 滑动窗口算法
- 最近使用缓存(LRU Cache)
- 队列(FIFO):用
五、注意事项
deque支持所有 list 的常用操作,但不支持切片(如d[1:3])。extendleft会逆序插入元素。- 可以指定最大长度
deque(iterable, maxlen=N),超出时自动丢弃头部/尾部元素。
六、示例代码
from collections import deque
d = deque([1, 2, 3])
d.append(4) # [1, 2, 3, 4]
d.appendleft(0) # [0, 1, 2, 3, 4]
print(d.pop()) # 4
print(d.popleft()) # 0
d.extend([5, 6]) # [1, 2, 3, 5, 6]
d.extendleft([-1, -2]) # [-2, -1, 1, 2, 3, 5, 6]
d.insert(2, 'a') # [-2, -1, 'a', 1, 2, 3, 5, 6]
d.rotate(3) # [3, 5, 6, -2, -1, 'a', 1, 2]
print(d)
七、总结
deque是高效的双端队列,支持头尾 O(1) 插入/删除。- 常用方法有:
append、appendleft、pop、popleft、extend、extendleft、insert、rotate。 - 适合队列、栈、滑动窗口等场景,是 list 的强力补充。
3万+

被折叠的 条评论
为什么被折叠?



