python deque 支持的操作

根据上文,可以大致理解 deque 模块的底层实现原理。

deque 支持多种操作:
创建一个新的空队列:

# 创建空的队列
d1 = deque()
print(d1)   # deque([])

创建已经存在元素的队列:

# 创建已经存在元素的对象:从 iterable (迭代对象) 数据创建。如果 iterable 没有指定,新队列为空。
d = deque("pig")
print(d)    # deque(['p', 'i', 'g'])

创建指定最大长度的队列:

# 创建指定最大长度的队列
d = deque(maxlen=10)
for i in range(1, 101):
    try:
        d.append(i)
        # print(d)
    except:
        traceback.print_exc()
        break

print(d)
# deque([91, 92, 93, 94, 95, 96, 97, 98, 99, 100], maxlen=10)

指定长度后,进行 append,超出最大长度,后面的元素会将前面的元素从左推出。

从右边添加元素:

# 从最右边添加元素
d = deque()
d.append({"what": "apple"})
print(d)

从左边添加元素:

# 从左边添加元素
d = deque()
for i in (1, 2, 3):
    d.appendleft(i)
print(d)

创建一份浅拷贝:

# 创建一份浅拷贝
d = deque([[1, 2, 3], "apple", 'ruiyang'])
dd = d.copy()
print(id(d))   # 4383179616 
print(id(dd))  # 4383831440 
d[0].append(4)
print(d)  # deque([[1, 2, 3, 4], 'apple', 'ruiyang']) 
print(dd)  # deque([[1, 2, 3, 4], 'apple', 'ruiyang'])

计算队列中等于某个值的个数:

# 计算队列中等于某个值的个数
d = deque([[1, 2, 3], "apple", 'ruiyang', 'apple'])
print(d.count("apple"))

通过 extend 进行右向扩展:

# extend(iterable) 扩展deque的右侧,通过添加iterable参数中的元素。
d = deque("ruiyang")
d.extend(["a", "b", "c"])
print(d)

通过 extendleft 进行左向扩展:

# extendleft(iterable)
# 扩展deque的左侧,通过添加iterable参数中的元素。注意,左添加时,在结果中iterable参数中的顺序将被反过来添加。
d.extendleft(['e', 'f', 'g'])
print(d)

通过 insert 进行插入:

# insert(i, x): 在位置 i 插入 x 。如果插入会导致一个限长 deque 超出长度 maxlen 的话,就引发一个 IndexError
d9 = deque("1234567890", maxlen=11)
d9.insert(0, {"index": 100})
print(d9)
# Deque的最大尺寸,如果没有限定的话就是 None 。
print(d9.maxlen)
print(len(d9))
try:
    d9.insert(0, "666")
except IndexError:
    print("长度超出")

通过 pop 从右边弹出元素:

# pop() 移去并且返回一个元素,deque 最右侧的那一个。 如果没有元素的话,就引发一个 IndexError
d = deque("ruiyang")
while True:
    try:
        print(d.pop())
    except:
        traceback.print_exc()
        break
    time.sleep(1)

popleft 从左边弹出:

# popleft() 移去并且返回一个元素,deque 最左侧的那一个。 如果没有元素的话,就引发 IndexError。
d = deque("ruiyang")
while True:
    try:
        print(d.popleft())
    except:
        traceback.print_exc()
        break
    time.sleep(1)

通过 remove 移除元素:

# remove(value) 移除找到的第一个 value。 如果没有的话就引发 ValueError。
d = deque("ruiyang")
d.remove('g')
print(d)

try:
    d.remove("o")
except:
    traceback.print_exc()

通过 reverse 进行逆序:

# reverse() 将deque逆序排列。返回 None 。
d = deque("ruiyang")
print("***** ", d)
d.reverse()
print("##### ", d)

通过 rotate 进行循环:

# rotate(n=1) 向右循环移动 n 步。 如果 n 是负数,就向左循环。
# 如果deque不是空的,向右循环移动一步就等价于 d.appendleft(d.pop()) , 向左循环一步就等价于 d.append(d.popleft()) 。
d = deque("ruiyang")
print(">>>1", d)
d.rotate(1)
print(">>>2", d)

通过 clear 清空全部的元素:

# 移除全部的元素 使其长度为 0
d = deque("ruiyang")
print(d)
d.clear()
print(d)

除了以上操作,deque 还支持迭代、封存、len(d)、reversed(d)、copy.copy(d)、copy.deepcopy(d)、
成员检测运算符 in 以及下标引用例如通过 d[0] 访问首个元素等。 索引访问在两端的复杂度均为 O(1) 但在中间则会低至 O(n)。
如需快速随机访问,请改用列表。

d = deque("ruiyang")
print(len(d))

for one in d:
    print(one)

for one in reversed(d):
    print(one)

import copy
d.appendleft([1, 2, 3])
d1 = copy.deepcopy(d)
d[0].append(4)
print(d)
print(d1)

print("r" in d)