使用list
存储数据时,按索引访问元素很快,但是插入和删除元素就很慢了,因为list
是线性存储,数据量大的时候,插入和删除效率很低。deque是为了高效实现插入和删除操作的双向列表,适合用于队列和栈。
初始化
下面代码先创建一个双向列表,初始化一些数据。
from collections import deque
a = deque([2,5,8,3,4])
print(a)
b = deque()
print(b)
c = deque('asdfg',4)
print(c)
d = deque((2,5,8))
print(d)
e = deque({2,5,8})
print(e)
f = deque({'a':1,'b':2,'c':3})
print(f)
deque([2, 5, 8, 3, 4])
deque([])
deque(['s', 'd', 'f', 'g'], maxlen=4)
deque([2, 5, 8])
deque([8, 2, 5])
deque(['a', 'b', 'c'])
deque方法初始化可以传入两个可选参数,第一个参数是一个可迭代对象iterable,第二个参数是双向列表的最大长度,一旦超过这个长度,将会自定去除左边的元素。
方法
增
- append():往右边添加元素,一次只能添加一个,不然会报错。
from collections import deque
a = deque()
a.append(5)
a.append([2,3])
print(a)
deque([5, [2, 3]])
- appendleft():往左边添加一个元素
>>>a.appendleft(6)
deque([6, 5, [2, 3]])
- extend():向右边扩展一个列表元素
>>>a.extend([1,2,3])
deque([6, 5, [2, 3], 1, 2, 3])
- extendleft():向左边扩展一个列表元素
>>>a.extendleft([5,6,7])
deque([7, 6, 5, 6, 5, [2, 3], 1, 2, 3])
- insert(index,p_object)():指定位置插入元素
from collections import deque
a = deque([1,5,8,6,9,2,5])
a.insert(2,'z')
print(a)
deque([1, 5, 'z', 8, 6, 9, 2, 5])
-
copy():浅复制
from collections import deque
a = deque([1,5,6])
b = a.copy()
print(b)
deque([1, 5, 6])
删
- pop():返回最右边的元素,并删除它
from collections import deque
a = deque([1,5,8,6,9,2,5])
print(a.pop())
print(a)
5
deque([1, 5, 8, 6, 9, 2])
- popleft():返回最左边的元素,并删除它
>>>a.popleft()
1
>>>a
deque([5, 8, 6, 9, 2])
- remove():删除指定元素,若有多个符合,先删除最左边的。返回None。
from collections import deque
a = deque([1,5,8,6,9,2,5])
print(a.remove(5))
print(a)
None
deque([1, 8, 6, 9, 2, 5])
- clear():清空元素,返回一个空的双向列表
查
- index(value[,start[,stop]]):查找某个元素的索引,可以限定查找范围
from collections import deque
a = deque([1,5,8,6,9,2,5])
print(a.index(5,3))
6
- count():返回指定元素出现的次数
from collections import deque
a = deque([1,5,8,6,9,2,5])
print(a.count(5))
2
改
- reverse():对元素进行反转
from collections import deque
a = deque([1,5,6,2,3])
a.reverse()
print(a)
deque([3, 2, 6, 5, 1])
- rotate():把右边元素放左边,可加入参数指定放几次,默认一次。
from collections import deque
a = deque([1,5,6,2,3])
a.rotate(2)
print(a)
deque([2, 3, 1, 5, 6])