1.3 保留最後N個元素
阿新 • • 發佈:2021-12-09
在迭代操作時,怎樣只保留最後有限幾個元素的歷史記錄?
問題描述
在迭代操作時,怎樣只保留最後有限幾個元素的歷史記錄?
解決方案
資料結構:collections.deque
例如,下面的程式碼在文字的每行做匹配,並返回匹配所在行之前的最後N行:
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) if __name__ == '__main__': with open(r'test.txt') as f: for line, prevlines in search(f, 'python', 5): for pline in prevlines: print(pline, end='') print('-' * 20)
總結
deque是一個雙向佇列,deque(maxlen=N)
會新建一個固定大小的佇列,當新元素加入並且這個佇列已滿時,最老的一個元素會被移除。
deque類可以被用在任何你只需要一個簡單佇列資料結構的場合。如果不設定最大佇列的大小,那麼就可以得到一個可以儲存無限多資料的佇列,deque可以在佇列的兩端執行新增和彈出元素的操作:
q = deque() q.append(1) q.append(2) # deque([1, 2]) q.appendleft(4) # deque([4, 1, 2]) p = q.pop() # p = 2, q = deque([4, 1]) p = q.popleft() # p = 4, q = deque([1])
在佇列兩端插入或刪除元素的時間複雜度都是O(1),而在列表開頭插入或刪除元素的時間複雜度為O(N)(因為後面的元素都要跟著往後或往前移動)。