官术网_书友最值得收藏!

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)。

主站蜘蛛池模板: 门头沟区| 安乡县| 金华市| 商城县| 岑巩县| 德庆县| 清徐县| 庆元县| 华安县| 鲁山县| 仁化县| 临潭县| 西城区| 宣化县| 梁山县| 南郑县| 大连市| 安多县| 富顺县| 原平市| 泗阳县| 灵川县| 洛阳市| 丰都县| 三门峡市| 太和县| 乌恰县| 新建县| 锡林浩特市| 新宁县| 吴忠市| 沭阳县| 西充县| 巫山县| 沅陵县| 灵台县| 塘沽区| 夏津县| 西安市| 镇沅| 漳平市|