1.3保留最后N个元素

问题

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

解决方案

​ 保留有限历史记录正是collection.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'./1-2解压可迭代对象赋值给多个变量.py')  as f:
        for line ,prevlines in search(f,'o',5):
            for pline in prevlines:
                print(pline,end='')
            print(line,end='')
            print('-'*20)

讨论

​ 我们在写查询元素的代码时,通常会使用包含yeild表达式的生成器函数,也就是我们上面示例代码中那样。这样可以在将搜索过程代码和使用搜索结果代码解耦。如果你还清楚什么是生成器,请看4.3节。

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

​ 代码示例:

q=deque(maxlen=3)
q.append(1)
q.append(2)
q.append(3)
print(q) # deque([1, 2, 3], maxlen=3)
q.append(4)
print(q) # deque([2, 3, 4], maxlen=3)
q.append(5)
print(q)# deque([3, 4, 5], maxlen=3)

​ 尽管你可以手动在一个列表上实现这一的操作(比如增加、删除等等)。但是这里的队列方案也会更加优雅并且影响的更快一些。

​ 一般的,deque类可以被用在恩和你只需要一个简单队列数据结构的场合。如果你不设置最大队列大小,那么就会得到一个无限大小的队列,你可以在队列的两端执行添加和弹出元素的操作。

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值