『Python CoolBook:Collections』數據結構和算法_collections.deque隊列&yield應用

1、collections.deque隊列

deque(maxlen=N)構造函數會新建一個固定大小的隊列。當新的元素加入而且這個隊列已滿的時候,最老的元素會自動被移除掉。html

若是你不設置最大隊列大小,那麼就會獲得一個無限大小隊列,你能夠在隊列的兩端執行添加和彈出元素的操做。python

一、deque其餘操做:

>>> q = deque()
>>> q.append(1)
>>> q.append(2)
>>> q.append(3)
>>> q
deque([1, 2, 3])
>>> q.appendleft(4)
>>> q
deque([4, 1, 2, 3])
>>> q.pop()
3
>>> q
deque([4, 1, 2])
>>> q.popleft()
4

.append():右插app

.append():左插函數

.pop():右彈出code

.pop():左彈出htm

二、和list比較的優勢:

在隊列兩端插入或刪除元素時間複雜度都是O(1),而在列表的開頭插入或刪除元素的時間複雜度爲O(N)。對象

 

2、問題

在迭代操做或者其餘操做的時候,怎樣只保留最後有限幾個元素的歷史記錄?blog

解決方案

保留有限歷史記錄正是 collections.deque 大顯身手的時候。好比,下面的代碼在多行上面作簡單的文本匹配,並只返回在前N行中匹配成功的行:隊列

from collections import deque


def search(lines, pattern, history=5):
    previous_lines = deque(maxlen=history)
    for li in lines:
        if pattern in li:
            yield li, previous_lines
        previous_lines.append(li)

# Example use on a file
if __name__ == '__main__':
    with open(r'../../cookbook/somefile.txt') as f:
        for line, prevlines in search(f, 'python', 5):
            for pline in prevlines:
                print(pline, end='')
            print(line, end='')
            print('-' * 20)

for直接迭代文件句柄就能夠直接使用句柄的迭代器層面的用法。get

yield生成的迭代對象自己就能夠做爲for循環或推導式的迭代對象。

相關文章
相關標籤/搜索