[TOC=1,5]
>[success] # 雙向隊列
雙向隊運行處理速度較快,從隊列兩端添加或彈出數據元素的復雜程度 O(1),列表的復雜程度為O(N)
<a href="https://wiki.python.org/moin/TimeComplexity">參考鏈接</a>
一個deque(雙端隊列)在內部被表示為一個雙鏈表。(好吧,是數組而不是對象的列表,以提高效率。)兩端都是可訪問的,但即使是在中間看也是很慢的,而且從中間添加或刪除也會更慢。

>[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通過裝飾器給裝飾函數加參數
- 線程和進程