双向队列是一个线程安全,可以快速从两端添加或者删除元素的数据类型;首尾操作操作的优化,也导致了双向队列付出了一些代价,比如:从队列中间删除元素就会非常的慢
栗子:
首先引包,然后定义一个队列,设置最大长度为10并打印出来
from collections import deque
dq = deque(range(10), maxlen=10)
print(dq)
运行后的结果如下:
deque([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], maxlen=10)
注释:
maxlen是一个可选参数,代表这个队列可以容纳的元素数量,而且一旦设定,这个属性就不能修改了。
队列方法使用
栗子:
注释:传负数时把元素往右端移动;反之传正数是把元素往左端移动
from collections import deque
dq = deque(range(10), maxlen=10)
print(f"移动前的数据:{dq}")
dq.rotate(-4)
print(f"移动后的数据:{dq}")
运行后的结果如下:
移动前的数据:deque([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], maxlen=10)
移动后的数据:deque([4, 5, 6, 7, 8, 9, 0, 1, 2, 3], maxlen=10)
栗子:
注释:s.append添加的元素在右端的最后一个,并删除左端的第一个元素;s.appendleft添加的元素在左端的第一个,并删除右端的最后一个元素
from collections import deque
dq = deque(range(10), maxlen=10)
print(f"添加前的数据:{dq}")
dq.append(10)
print(f"添加后的数据:{dq}")
运行后的结果如下:
添加前的数据:deque([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], maxlen=10)
添加后的数据:deque([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], maxlen=10)
栗子:
注释:s.extend在左端会逐个删除元素个数,括号中必须是可迭代的序列,不然运行就会抛TypeError: 'xxx' object is not iterable;s.extendleft则与之相反
from collections import deque
dq = deque(range(10), maxlen=10)
print(f"添加前的数据:{dq}")
dq.extend([10, 11, 12])
print(f"添加后的数据:{dq}")
运行后的结果如下:
添加前的数据:deque([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], maxlen=10)
添加后的数据:deque([3, 4, 5, 6, 7, 8, 9, 10, 11, 12], maxlen=10)
栗子:
注释:s.reverse只是旋转,并不是排序,区分开;s.remove只是移除首个出现的重复元素
from collections import deque
dq = deque([1, 2, 3, 4, 5, 6, 7, 7, 7], maxlen=10)
print(f"旋转序列前的数据:{dq}")
dq.reverse()
print(f"旋转序列前的数据:{dq}")
dq.remove(7)
print(f"移除后的数据:{dq}")
运行后的结果如下:
旋转序列前的数据:deque([1, 2, 3, 4, 5, 6, 7, 7, 7], maxlen=10)
旋转序列前的数据:deque([7, 7, 7, 6, 5, 4, 3, 2, 1], maxlen=10)
移除后的数据:deque([7, 7, 6, 5, 4, 3, 2, 1], maxlen=10)
栗子:
注释:移除成功会返回被移除元素的值
from collections import deque
dq = deque([1, 2, 3, 6, 5, 4, 7, 7, 7], maxlen=10)
print(f"移除前的数据:{dq}")
print(dq.pop())
print(f"移除后的数据:{dq}")
print(f"移除前的数据:{dq}")
print(dq.popleft())
print(f"移除后的数据:{dq}")
运行后的结果如下:
移除前的数据:deque([1, 2, 3, 6, 5, 4, 7, 7, 7], maxlen=10)
7
移除后的数据:deque([1, 2, 3, 6, 5, 4, 7, 7], maxlen=10)
移除前的数据:deque([1, 2, 3, 6, 5, 4, 7, 7], maxlen=10)
1
移除后的数据:deque([2, 3, 6, 5, 4, 7, 7], maxlen=10)
栗子:
from collections import deque
dq = deque([1, 2, 3, 6, 5, 4, 7, 7, 7], maxlen=10)
print(f"未操作的数据:{dq}")
print(dq.count(7))
dq.clear()
print(f"clear后的数据:{dq}")
运行后的结果如下:
未操作的数据:deque([1, 2, 3, 6, 5, 4, 7, 7, 7], maxlen=10)
3
clear后的数据:deque([], maxlen=10)
以上总结或许能帮助到你,或许帮助不到你,但还是希望能帮助到你,如有疑问、歧义,评论区留言会及时修正发布,谢谢!
未完,待续…
一直都在努力,希望您也是
微信搜索公众号:就用python