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)
# Example use on a file
if __name__ == '__main__':
    with open('somefile.txt') as f:
        for line, prevlines in search(f, 'python', 5):
            for pline in prevlines:
                print(pline, end='')
            print(line, end='')
            print('-'*20)

讨论

在编写搜索元素的代码时,通常都使用包含yield的Generators函数,这可以降低搜索过程。

使用deque(maxlen=N)创建一个固定大小的队列。当新元素加入后并且队列满了,最先加入的元素自动移除,举例:

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

同样,你也可以对list手动执行这些操作(e.g. appending,deleting,etc),使用queue的解决方法更加简介和高效。

一般的说,只要你需要一个简单队列结构都可以使用deque。如果你不想给定大小,你将得到一个可以让你append和pop元素的无界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

从deque的开始或结尾add或者pop元素的圈复杂度是O(1),然而list做同样操作的复杂度是O(N)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ensp1.3.00.100 是指华为公司推出的一款网络规划与设计工具软件。该软件致力于提供全面的网络规划与设计服务,帮助企业轻松构建稳定、高效的网络环境。 ensp1.3.00.100 的主要功能包括网络拓扑图的创建与编辑、数据拓扑分析、安全性分析、性能评估等。用户可以通过该软件,根据具体需求,快速构建企业网络的拓扑结构,并进行细致的配置与调整。通过ensp1.3.00.100,管理员能够清晰地了解整个网络的架构和组成,有针对性地进行规划和优化,以提高网络的稳定性和安全性。 ensp1.3.00.100 还具有强大的网络仿真功能,可通过模拟真实网络场景,进行性能评估和容量规划。管理员可以根据网络的流量、设备负载等参数,评估网络的性能状况,判断是否需要进行升级或扩展。同时,该软件还支持安全性分析,可以检测网络中的潜在风险和漏洞,并提供相应的解决方案。 ensp1.3.00.100的简单易用是其亮点之一。软件提供了直观的用户界面和丰富的网络组件库,用户可以轻松创建和编辑网络拓扑图,进行各种配置操作。此外,软件还支持自动化的规划与设计,通过算法优化、智能化分析等功能,提高了网络规划与设计的效率和准确性。 总而言之,ensp1.3.00.100是一款功能强大、易于使用的网络规划与设计工具软件,可以帮助企业构建高效、安全的网络环境,提高网络性能,降低维护成本。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值