Python collections中的双向队列deque简单介绍详解
前言
在Python的collections模块中,deque是一个强大的数据结构,它可以帮助我们实现高效的队列和栈操作。deque是一个双向队列,因此支持从两端进行操作,其实现方式使得它比使用列表实现队列的方式更加高效。
使用方法
创建deque
在使用deque之前,首先需要导入collections模块:
from collections import deque
创建deque的方式有多种,可以使用空的deque:
d = deque()
也可以使用一个可迭代对象(例如列表)来创建deque:
d = deque([1, 2, 3])
添加元素
双向队列支持从头和尾部添加元素,分别使用appendleft和append方法。例如:
d.append(4) # 从右端添加元素,d现在为deque([1, 2, 3, 4])
d.appendleft(0) # 从左端添加元素,d现在为deque([0, 1, 2, 3, 4])
删除元素
双向队列同样支持从头和尾部删除元素,分别使用popleft和pop方法。例如:
d.pop() # 从右端删除元素,d现在为deque([0, 1, 2, 3])
d.popleft() # 从左端删除元素,d现在为deque([1, 2, 3])
获取元素
deque同样支持从头和尾部获取元素,分别使用index和reverse_index方法。例如:
d.index(1) # 返回1的位置,即0
d.reverse_index(2) # 返回2的位置,即1(因为deque是双向的)
其他操作
除了前面提到的操作之外,deque还支持以下几种操作:
- rotate(n):将deque向右循环移动n步(如果n为负数则向左移动)。
- clear():清空deque。
- extend(iter):将可迭代对象中的元素加入deque,与列表的extend方法类似。
- extendleft(iter):将可迭代对象中的元素从左端加入deque。
示例说明
基本队列
双向队列的最基本用法就是作为一个队列来使用,可以使用append和popleft方法实现队列的操作。例如:
q = deque()
q.append(1)
q.append(2)
print(q.popleft()) # output: 1
print(q.popleft()) # output: 2
实现一个滑动窗口
有时候我们需要维护一个滑动窗口,并在窗口中查找某个元素是否存在。使用deque可以非常方便地实现这个功能,例如:
def find_element_in_window(nums, window_size, target):
window = deque(nums[:window_size], maxlen=window_size)
for i in range(window_size, len(nums)):
if target in window:
return True
window.append(nums[i])
return target in window
nums = [1, 3, -1, -3, 5, 3, 6, 7]
print(find_element_in_window(nums, 3, 0)) # output: True
print(find_element_in_window(nums, 3, 5)) # output: True
print(find_element_in_window(nums, 3, 2)) # output: False
在上面的示例中,我们使用deque维护了一个长度为3的窗口,逐步向右移动并向窗口中添加元素。如果目标元素在窗口中,则返回True,否则在循环结束后再检查一次。注意,在创建deque时我们设置了maxlen参数,这意味着当deque长度超过maxlen时,最左边(最老的)的元素自动被删除,因此每次添加新元素时deque的长度始终为3。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python collections中的双向队列deque简单介绍详解 - Python技术站