python:双向队列Deque

双向队列是一个线程安全,可以快速从两端添加或者删除元素的数据类型;首尾操作操作的优化,也导致了双向队列付出了一些代价,比如:从队列中间删除元素就会非常的慢

 

栗子:

首先引包,然后定义一个队列,设置最大长度为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是一个可选参数,代表这个队列可以容纳的元素数量,而且一旦设定,这个属性就不能修改了。

 

队列方法使用

 

  • s.rotate();把n个元素从一端移动到另一端

栗子:

注释:传负数时把元素往右端移动;反之传正数是把元素往左端移动

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();添加一个元素在最左端

栗子:

注释: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();可迭代序列中的数据逐个被添加到序列的右端
  • s.extendleft();可迭代序列中的数据逐个被添加到序列的左端

栗子:

注释: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();移除序列中第一次出现的e元素

栗子:

注释: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)
  • s.pop();移除队列中右端的最后一个元素
  • s.popleft();移除队列中左端的第一个元素

栗子:

注释:移除成功会返回被移除元素的值

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)
  • s.count();计算队列中元素出现的次数
  • s.clear();清空队列元素

栗子:

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

python:双向队列Deque_第1张图片

 

 

你可能感兴趣的:(python,python,队列,queue)