zoukankan      html  css  js  c++  java
  • 『Python CoolBook:Collections』数据结构和算法_collections.deque队列&yield应用

    一、collections.deque队列

    deque(maxlen=N)构造函数会新建一个固定大小的队列。当新的元素加入并且这个队列已满的时候,最老的元素会自动被移除掉。

    如果你不设置最大队列大小,那么就会得到一个无限大小队列,你可以在队列的两端执行添加和弹出元素的操作。

    1、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():右插

    .append():左插

    .pop():右弹出

    .pop():左弹出

    2、和list比较的优点:

    在队列两端插入或删除元素时间复杂度都是O(1),而在列表的开头插入或删除元素的时间复杂度为O(N)。

     

    二、问题

    在迭代操作或者其他操作的时候,怎样只保留最后有限几个元素的历史记录?

    解决方案

    保留有限历史记录正是 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直接迭代文件句柄就可以直接使用句柄的迭代器层面的用法。

    yield生成的迭代对象本身就可以作为for循环或推导式的迭代对象。

  • 相关阅读:
    2019秋季 关于C语言指针等探索
    第四次作业
    第三次作业
    错误总结
    第二次作业
    第一次随笔
    Linux Mint安装Docker踩坑指南
    浅论Javascript在汽车信号测试中的应用
    [瞎玩儿系列] 使用SQL实现Logistic回归
    MongoDB的账户与权限管理及在Python与Java中的登录
  • 原文地址:https://www.cnblogs.com/hellcat/p/8565926.html
Copyright © 2011-2022 走看看