- Python進階編程:編寫更高效、優雅的Python代碼
- 劉宇宙 謝東 劉艷
- 491字
- 2021-04-30 12:39:46
3.3.2 保留最后N個元素
在執行迭代操作或者其他操作的時候,為了滿足某些業務需求,我們需要只保留最后有限的元素歷史記錄。
保留有限歷史記錄可以使用collections.deque。例如,在多行記錄上做簡單的文本匹配,并返回與所在行匹配的最后N行,代碼如下:
from collections import deque def search(lines, search_val, history=1): previous_lines = deque(maxlen=history) for line in lines: if search_val in line: yield line, previous_lines previous_lines.append(line) if __name__ == '__main__': with open(r'test_file/element.txt') as f: for search_v, prev_lines in search(f, 'python', 2): for pre_line in prev_lines: print(pre_line, end='') print(f'search value is:{search_v}')
在寫查詢元素的代碼時,我們通常會使用包含yield表達式的生成器函數。使用yield表達式可以將搜索過程代碼和搜索結果代碼解耦。
使用deque(maxlen=N)構造函數時會新建一個固定大小的隊列。deque類的工作機制為:當新的元素加入并且隊列已達到固定大小的時候,最老的元素會自動被移除,這樣可以保證所查找元素的前N個元素被保留。
這里,我們也可以手動在列表上實現增加、刪除等操作。不過,deque方案會更加優雅,并且運行得更快些。
一般地,deque類可以被用在任何只需要一個簡單隊列數據結構的場合。在使用deque類時,若不設置最大隊列大小,就會得到一個無限大小隊列。我們可以在隊列的兩端執行添加和彈出元素的操作,deque類中提供了append()、appendleft()、pop()、popleft()等函數。
使用deque類在隊列兩端插入或刪除元素的時間復雜度都是O(1),在列表的開頭插入或刪除元素的時間復雜度為O(N)。