今天这节,要学习的内容是deque。 在Python中,deque是一个类似列表的容器。 在Python的参考文档中,有它的详细解释:https://docs.python.org/zh-cn/3/library/collections.html#collections.deque
知识点
- deque是一个双向队列。发音是 “deck”,”double-ended queue”的简称
- 从两端都可以进行在内存里高效的进行添加和弹出操作。复杂度是O(1),相比列表的话是O(n),复杂度更小
- 若maxlen乜有指定或者是None,则deque的长度是无限的,若指定了maxlen则长度为指定的长度,超出长度,则先进先出。
代码语言:javascript复制在这里我声明了一个deque,声明时候指定长度为2,所以当在长度满了的时候,再次增加元素,就会将1弹出。也就是说:当新的元素进入时候,如果达到长度上线,则最老的元素会被弹出 (队列的特点:先进先出)
dq = deque(maxlen=2)
dq.append(1)
dq.append(2)
print(dq) #deque([1, 2], maxlen=2)
dq.append(3)
print(dq) #deque([2, 3], maxlen=2)
代码语言:javascript复制在这里我声明了一个deque,没有声明长度,所以长度可以无限扩大。从下面的代码可以看到 deque支持从两端进行操作。默认的append 和 pop都是增加和弹出最右边的元素。 也支持appendleft和popleft从左边添加和弹出元素
from collections import deque
dq2 = deque()
dq2.append(1)
dq2.append(2)
dq2.append(3)
dq2.append(4)
print(dq2) #deque([1, 2, 3, 4])
dq2.appendleft(0)
print(dq2) #deque([0, 1, 2, 3, 4])
dq2.pop()
print(dq2) #deque([0, 1, 2, 3])
dq2.popleft()
print(dq2) #deque([1, 2, 3])
综上所述:若频繁的需要在两端更改数据,可以考虑使用deque。 还有一个场景是,如果你有读取某一个文件的最后几行的需求,就可以利用deque的特性来实现,比如我要读取这个文本的最后3行,那么只需要声明一个长度为3的deque来接收文件的每一行即可。
代码语言:javascript复制from collections import deque
# hello2
# hello2
# -----
# 'hxd1'
# 'hxd2'
# 'hxd4'
dq2 = deque(maxlen=3)
with open ('test.txt') as f :
for i in f.read().splitlines():
dq2.append(i)
print(dq2) #deque(["'hxd1'", "'hxd2'", "'hxd4'"], maxlen=3)