[TOC=1,5]
>[success] # 双向队列
双向队运行处理速度较快,从队列两端添加或弹出数据元素的复杂程度 O(1),列表的复杂程度为O(N)
<a href="https://wiki.python.org/moin/TimeComplexity">参考链接</a>
一个deque(双端队列)在内部被表示为一个双链表。(好吧,是数组而不是对象的列表,以提高效率。)两端都是可访问的,但即使是在中间看也是很慢的,而且从中间添加或删除也会更慢。
![](https://box.kancloud.cn/6deddcc7f94fce47c051176685b36a6f_368x292.png)
>[info] ## 基本使用
`collections` -- `收集的意思`
>[danger] ##### deque-maxlen 设置长度 先进先出
~~~
from collections import deque
d = deque(maxlen=3)
d.extend(['a','b','c','d','e'])
print(d)
打印结果:
deque(['c', 'd', 'e'], maxlen=3)
~~~
>[danger] ##### deque-append 右添加数据
* 添加速度O(1)
~~~
from collections import deque
d = deque()
d.append(1)
d.append(2)
print(d)
打印结果:
deque([1, 2])
~~~
>[danger] ##### deque-appendleft 左添加数据
* 添加速度O(1)
~~~
from collections import deque
d = deque()
d.append(1)
d.append(2)
d.appendleft(3)
print(d)
打印结果:
deque([3, 1, 2])
~~~
>[danger] ##### deque-clear 清除数据
~~~
from collections import deque
d = deque()
d.append(1)
d.append(2)
d.clear()
print(d)
打印结果:
deque([])
~~~
>[danger] ##### deque-copy(浅拷贝)
* copy速度 O(n)
~~~
from collections import deque
d = deque()
d.append(1)
d.append(2)
new_d = d.copy()
print(new_d)
打印结果:
deque([1, 2])
~~~
>[danger] ##### deque-count(返回指定元素的出现次数)
~~~
from collections import deque
d = deque()
d.append(1)
d.append(3)
d.append(3)
print(d.count(3))
打印结果:
2
~~~
>[danger] ##### deque-extend(从队列右边扩展一个列表的元素)
* 添加速度等于 添加列表决定O(K)
~~~
from collections import deque
d = deque()
d.append(1)
d.append(3)
d.append(3)
d.extend([1,5,6])
print(d)
打印结果:
deque([1, 3, 3, 1, 5, 6])
~~~
>[danger] ##### deque-extendleft(从队列左边扩展一个列表的元素)
* 添加速度等于 添加列表决定O(K)
~~~
from collections import deque
d = deque()
d.append(1)
d.append(3)
d.append(3)
d.extendleft([1,5,6])
print(d)
打印结果注意添加的列表顺序也反过来了:
deque([6, 5, 1, 1, 3, 3])
~~~
>[danger] ##### deque-index(查找某个元素的索引位置)
~~~
from collections import deque
d = deque()
d.append(1)
d.append(3)
d.append(4)
d.append(3)
print(d)
print(d.index(3)) # 相同时值显示第一个的位置
print(d.index(3,2,4)) # 指定查找区间
打印结果:
deque([1, 3, 4, 3])
1
3
~~~
>[danger] ##### deque-insert(在指定位置插入元素)
~~~
from collections import deque
d = deque()
d.extend(['a','b','c','d','e'])
d.insert(2,'z')
print(d)
打印结果:
deque(['a', 'b', 'z', 'c', 'd', 'e'])
~~~
>[danger] ##### deque-pop(获取最右边一个元素,并在队列中删除)
* 删除速度等于 添加列表决定O(1)
~~~
from collections import deque
d = deque()
d.extend(['a','b','c','d','e'])
d.pop()
print(d)
打印结果:
deque(['a', 'b', 'c', 'd'])
~~~
>[danger] ##### deque-popleft(获取最左边一个元素,并在队列中删除)
* 删除速度等于 添加列表决定O(1)
~~~
from collections import deque
d = deque()
d.extend(['a','b','c','d','e'])
d.popleft()
print(d)
打印结果:
deque(['b', 'c', 'd', 'e'])
~~~
>[danger] ##### deque-remove(删除指定元素)
* 删除速度等于 添加列表决定O(K)
~~~
import collections
d = collections.deque()
d.extend(['a','b','c','d','e'])
d.remove('c')
print(d)
打印结果:
deque(['a', 'b', 'd', 'e'])
~~~
>[danger] ##### deque-reverse(队列反转)
~~~
import collections
d = collections.deque()
d.extend(['a','b','c','d','e'])
d.reverse()
print(d)
输出:
deque(['e', 'd', 'c', 'b', 'a'])
~~~
>[danger] ##### deque-rotate(把右边元素放到左边)
* 速度等于 添加列表决定O(K)
~~~
from collections import deque
d = deque()
d.extend(['a','b','c','d','e'])
d.rotate(2) # 数字决定右面几个变成左面
print(d)
输出:
deque(['d', 'e', 'a', 'b', 'c'])
~~~
>[success] # 案例
>[danger] ##### 关键词匹配成功后,打印匹配前的内容和匹配内容
~~~
from collections import deque
def search(lines,pattern,history=5):
previous_lines = deque(maxlen=history)
for line in lines:
# 匹配成功才返回,匹配内容
if pattern in line:
yield line,previous_lines
previous_lines.append(line)
print(previous_lines)
with open("somefile.txt") as f:
# 匹配成功了 yield 中才有对应的返回值
for line,prevlines in search(f,"python",5):
for pline in prevlines:
print(pline,end=" ")
print(line,end='')
print("-"*20)
~~~
- PYTHON-- 基础
- Python -- 变量、常量、注解
- 算数\比较\赋值\逻辑运算符
- Python -- input 控制台用户输入
- Python -- 流程控制/循环语句
- Python -- 切片
- Python -- 数据类型
- 基础数据类型
- int -- 数字类型
- str -- 字符类型
- bool -- 布尔类型
- list -- 列表
- type -- 元祖
- dict -- 字典
- set -- 集合
- Python -- 深浅copy
- Python -- 文件的读写
- Python -- 函数
- 函数 -- 做参数使用
- 函数 -- 闭包
- 函数 -- 生成器
- 函数 -- 列表推导式
- 案例
- 基础案例一
- 基础案例二
- 基础案例三
- COOKBOOK
- LIST、STR、DICT、TUPLE
- LIST - 列表方法总结
- 一、序列拆分成单独变量
- 二、* 妙用
- 三、deque- 双向队列
- 四、求找到最大或最小的N个元素
- 4.1 heapq-- 简单使用
- 五、去重并保持列表顺序不变
- 六、切片slice
- 七、counter 统计序列中元素次数
- 八、itemgetter 列表套着字典排序
- 九、处理大量的列表数据
- 十、随机事件处理列表
- DICT - 字典的总结方法
- 一、defaultdict 解决 KeyError
- 二、OrdereDict有序字典
- 三、zip 和 max/min 比较
- IDCT和LIST- 推导式
- 一、LIST 推导式
- 二、字典推到式
- TUPLE-元组
- 一、命名元组
- STR-字符串
- 一、常见的字符串方法
- 二、字符串拆分
- 三、字符串的位置匹配
- 四、字符串替换
- 五、正则大小写/换行匹配
- 六、对字节类型处理
- 数字、日期、时间处理
- 一、数字的处理
- 二、时间换算
- 2.1 时间运算
- 2.2计算某一时刻上周几的日期
- 2.2对时间转换格式优化
- 迭代器和生成器
- 一、iter 迭代器 使用案例
- 二、生成器 yeild
- 三、构建一个反向迭代方法
- 四、实现反正函数构造
- 五、迭代对象切片/跳过元素
- 六、迭代出所有的组合排列
- 七、索引-值迭代序列化
- 八、zip 同时迭代多个序列
- 九、同时循环多个可迭代对象
- 十、yield from 递归案例
- 十一、合并序列,并按顺序输出
- 十二、使用 iter 替代 while True
- 操作文件
- 一、处理文件路径
- 二、检测文件/获取文件信息
- 函数
- 一、函数基本案例使用
- 二、匿名函数
- 三、回调函数
- 四、闭包实现一个单个方法类
- 五、函数嵌套回调函数
- 类与对象
- 一、str/repr--让类字符串表示
- 二、format -- 格式化类的内容
- 三、with -- 上下文管理类
- 四、创建节省内存的类
- 五、将类里面方法变成属性
- 六、调用父类方法
- 七、扩展子类中的属性
- 八、创建新的类或者实类属性
- 九、简化数据结果,简化init
- 十、python 接口写法
- 十一、通过类属性创建委托访问
- 十二、__new__重新初始化init
- 十三、通过字符串调用类
- 元编程
- 一、装饰器
- 1.1 去掉装饰器修饰
- 1.2 可接受参数装饰器
- 1.3利用装饰器对函数参数类型检查
- 1.4编写类装饰器
- 1.5为类方法和静态方法加装饰器
- 1.6通过装饰器给装饰函数加参数
- 线程和进程