python双向队列deque的使用
作者:cv_lhp
双向队列deque
双端队列,可以快速的从另外一侧追加和推出对象,deque是一个双向链表,针对list连续的数据结构插入和删除进行优化。
它提供了两端都可以操作的序列,这表示在序列的前后你都可以执行添加或删除操作。双向队列(deque)对象支持以下方法:
1. append()
添加元素x到队列右端
###定义deque(字符串形式) d = deque('ghi') ##或者列表形式定义deque: # d = deque(['g', 'h', 'i']) d.append('j') d deque(['g', 'h', 'i', 'j'])
2. appendleft()
添加元素x到队列左端
d.appendleft('f') d deque(['f', 'g', 'h', 'i', 'j'])
3. clear()
移除所有元素,使其长度为0
d = deque('ghi') d.clear() d deque([])
4. copy()
创建一份浅拷贝
d = deque('xiaoweuge') y = d.copy() print(y) deque(['x', 'i', 'a', 'o', 'w', 'e', 'u', 'g', 'e'])
5. count()
计算 deque 中元素等于 x 的个数
d = deque('xiaoweuge-shuai') d.count('a') 2
6. extend()
扩展deque的右侧,通过添加iterable参数中的元素
a = deque('abc') b = deque('cd') a.extend(b) a deque(['a', 'b', 'c', 'c', 'd']) #与append 的区别 a = deque('abc') b = deque('cd') a.append(b) deque(['a', 'b', 'c', deque(['c', 'd'])])
7. extendleft()
扩展deque的左侧,通过添加iterable参数中的元素。注意对左添加时,在结果中iterable参数中的顺序将被反过来添加
a = deque('abc') b = deque('cd') a.extendleft(b) a deque(['d', 'c', 'a', 'b', 'c'])
8. index()
返回元素 x 在 deque 中的位置(在索引 start 之后,索引 stop 之前)。 返回第一个匹配项,如果未找到则引发 ValueError
d = deque('xiaoweuge') d.index('w') 4
9. insert()
在位置 i 插入 x ,如果插入会导致一个限长 deque 超出长度 maxlen 的话,就引发一个 IndexError
a = deque('abc') a.insert(1,'X') deque(['a', 'X', 'b', 'c'])
10. pop()
移去并且返回deque 最右侧的那一个元素。 如果没有元素的话,就引发一个 IndexError
d = deque('abcj') d.pop() 'j'
11. popleft()
移去并且返回一个元素,deque 最左侧的那一个元素。 如果没有元素的话,就引发 IndexError
d = deque('abcj') d.popleft() 'a'
12. remove(value)
移除找到的第一个 value。 如果没有的话就引发 ValueError
a = deque('abca') a.remove('a') a deque(['b', 'c', 'a'])
13. reverse()
将deque逆序排列,返回 None
#逆序排列 d = deque('ghi') # 创建一个deque list(reversed(d)) ['i', 'h', 'g'] deque(reversed(d)) deque(['i', 'h', 'g'])
14. rotate(n=1)
向右循环移动 n 步。 如果 n 是负数,就向左循环。如果deque不是空的,向右循环移动一步就等价于 d.appendleft(d.pop()) , 向左循环一步就等价于 d.append(d.popleft())
# 向右边挤一挤 d = deque('ghijkl') d.rotate(1) d deque(['l', 'g', 'h', 'i', 'j', 'k']) # 向左边挤一挤 d.rotate(-1) d deque(['g', 'h', 'i', 'j', 'k', 'l']) #看一个更明显的 x = deque('12345') x deque(['1', '2', '3', '4', '5']) x.rotate() x deque(['5', '1', '2', '3', '4']) d = deque(['12','av','cd']) d.rotate(1) deque(['cd', '12', 'av']
15. maxlen
Deque的最大尺寸,如果没有限定的话就是 None
from collections import deque d=deque(maxlen=10) for i in range(20): d.append(i) d deque([10, 11, 12, 13, 14, 15, 16, 17, 18, 19])
16. 其他操作
除了以上操作,deque还支持迭代、封存、len(d)、reversed(d)、copy.deepcopy(d)、copy.copy(d)、成员检测运算符 in 以及下标引用例如通过 d[0] 访问首个元素等。 索引访问在两端的复杂度均为 O(1) 但在中间则会低至 O(n)。 如需快速随机访问,请改用列表。
Deque从版本3.5开始支持 __ add (), mul __(),和 __ imul __() 操作。
from collections import deque d = deque('ghi') # 创建一个deque for elem in d: print(elem.upper()) G H I #从右边添加一个元素 d.append('j') d deque(['g', 'h', 'i', 'j']) #从左边添加一个元素 d.appendleft('f') d deque(['f', 'g', 'h', 'i', 'j']) #右边删除 d.pop() 'j' #左边边删除 d.popleft() 'f' #看看还剩下啥 list(d) # ['g', 'h', 'i'] #成员检测 'h' in d True #添加多个元素 d.extend('jkl') d deque(['g', 'h', 'i', 'j', 'k', 'l']) d.clear() # empty the deque d.pop() # cannot pop from an empty deque Traceback (most recent call last): File "<pyshell#6>", line 1, in -toplevel- d.pop() IndexError: pop from an empty deque d.extendleft('abc') # extendleft() reverses the input order d deque(['c', 'b', 'a']
参考链接
【万字长文详解】Python库collections,让你击败99%的Pythoner
到此这篇关于python双向队列deque的使用的文章就介绍到这了,更多相关python双向队列deque内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!