保存最后N个元素

cookbook系列

问题:对要搜索的值的最后几项做个有限的历史记录。

方案:

 1 #coding=utf-8
 2 from collections import deque
 3
 4 def search(lines, pattern, history=5):
 5     previous_lines = deque(maxlen=history)  #deque双端队列
 6     for line in lines:
 7         if pattern in line:
 8             yield line, previous_lines      #生成器,双端队列保存5个,意味着在找到pattern之前会记录5行数据,pattern就在line里面
 9         previous_lines.append(line)
10
11 # Example use on a file
12 if __name__ == ‘__main__‘:
13     with open(‘somefile.txt‘) as f:
14         for line, prevlines in search(f, ‘python‘, 5):
15             for pline in prevlines:
16                 print pline,  #先输出队列里的5个
17             print line,     #在输出pattern的line
18             print(‘-‘*20)

案例文件:somefile.txt

=== Keeping the Last N Items

==== Problem

You want to keep a limited history of the last few items seen
during iteration or during some other kind of processing.

==== Solution

Keeping a limited history is a perfect use for a `collections.deque`.
For example, the following code performs a simple text match on a
sequence of lines and prints the matching line along with the previous
N lines of context when found:

[source,python]
----
from collections import deque

def search(lines, pattern, history=5):
    previous_lines = deque(maxlen=history)
    for line in lines:
        if pattern in line:
            for pline in previous_lines:
                print(lline, end=‘‘)
            print(line, end=‘‘)
            print()
        previous_lines.append(line)

# Example use on a file
if __name__ == ‘__main__‘:
    with open(‘somefile.txt‘) as f:
         search(f, ‘python‘, 5)
----

==== Discussion

Using `deque(maxlen=N)` creates a fixed size queue.  When new items
are added and the queue is full, the oldest item is automatically
removed.   For example:

[source,pycon]
----
>>> 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)
----

Although you could manually perform such operations on a list (e.g.,
appending, deleting, etc.), the queue solution is far more elegant and
runs a lot faster.

More generally, a `deque` can be used whenever you need a simple queue
structure.  If you don‘t give it a maximum size, you get an unbounded
queue that lets you append and pop items on either end.  For example:

[source,pycon]
----
>>> 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
----

Adding or popping items from either end of a queue has O(1)
complexity.   This is unlike a list where inserting or removing
items from the front of the list is O(N).    

运行结果:

H:\Python27_64\python.exe H:/myfile/python-cookbook-master/src/1/keeping_the_last_n_items/example.py
Keeping a limited history is a perfect use for a `collections.deque`.
For example, the following code performs a simple text match on a
sequence of lines and prints the matching line along with the previous
N lines of context when found:

[source,python]
--------------------
        previous_lines.append(line)

# Example use on a file
if __name__ == ‘__main__‘:
    with open(‘somefile.txt‘) as f:
         search(f, ‘python‘, 5)
--------------------

进程已结束,退出代码0

讨论:

第5行双端队列deque的用法

固定长度队列:>>> 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)
双端队列:
>>> 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
两者皆有:设置好固定长度时,左右两端均可添加和删除

使用双端队列要比列表 方便、简洁!

时间: 2024-10-28 21:27:06

保存最后N个元素的相关文章

appium 学习各种小功能总结--功能有《滑动图片、保存截图、验证元素是否存在、》---新手总结(大牛勿喷,新手互相交流)

1.首页滑动图片点击 1 /** 2 * This Method for swipe Left 3 * 大距离滑动 width/6 除数越大向左滑动距离也越大. 4 * width:720 5 *height:1280 6 * @author Young 7 * @param driver2 8 * @param during 9 */ 10 public void swipeToLeft2(AndroidDriver driver2, int during) { 11 int width =

保存最后N个元素(collections.deque)

1.deque(maxlen=N)创建一个固定长度的队列,当有新的记录加入而队列已经满时,会自动移除老的记录(队列更加优雅和快速) 1 from collections import deque 2 q = deque(maxlen=3) 3 q.append(1) 4 q.append(2) 5 q.append(3) 6 q 7 deque([1, 2, 3], maxlen=3) 8 q.append(4) 9 q 10 deque([2, 3, 4], maxlen=3) 2.找到最大或

给定字符串数组,用map的key保存数组中字符串元素,value保存字符串元素出现次数,最后统计个字符串元素出现次数

import java.util.HashMap; public class map1 { public static void main(String[] args) { String[] array = {"a","b","a","b","c","a","b","c","b"}; HashMap hm = new HashM

【python cookbook】【数据结构与算法】3.保存最后N个元素

问题:希望在迭代或是其他形式的处理过程中对最后几项记录做一个有限的历史记录统计 解决方案:选择collections.deque. 如下的代码对一系列文本行做简单的文本匹配操作,当发现有匹配时就输出当前的匹配行以及最后检查过的N行文本: from collections import deque def search(lines, pattern, history=5): previous_lines = deque(maxlen=history) for line in lines: if p

jQuery-处理元素内容、表单元素

处理元素内容 1.text方法 使用说明: 1)不传参数 得到jQuery对象内所有元素及其后代元素的文本内容 2)传入用于设置匹配元素的文本内容 3)传入function 使用函数来设置jQuery对象中每个元素的文本 两个参数:第一个表示当前元素序号,第二个参数表示当前元素的文本 函数内部this代表当前的html元素对象 返回要设置的内容 2.html方法 取得第一个匹配元素的html内容 或 设置元素的html内容 使用方式同上处理表单元素 1.val方法 使用说明: 1)不传参数 得到

JavaScript的DOM_获取元素方法_getElementsByTagName()获取相同元素的节点列表

不管是 getElementById 还是 getElementsByTagName,在传递参数的时候,并不是所有浏览器都必须区分大小写,为了防止不必要的错误和麻烦,我们必须坚持养成区分大小写的习惯. 一.通过标签名获取节点 1.getElementsByTagName()方法通过标签名获取节点,因为标签名会重复,所以返回一个对象数组 HTMLCollection(NodeList),这个数组保存着所有相同元素名的节点列表. <script type="text/javascript&qu

13.删除单链表中重复的元素

13.删除单链表中重复的元素 思路: 用Hashtable辅助,遍历一遍单链表就能搞定.同高级函数9的原因,我不太会使用C++STL中的hash.而如果使用set集合来存储链表中的所有的值,实际上效率和每次重新遍历单链表是一样的.“用了c++标准库中的set来保存访问过的元素,所以很方便的就可以判断当前节点是否在set集合中,直接使用set提供的find函数就可以了.而且使用set的查找在时间复杂度上比较低.”我不太清楚STL中set集合的实现方式,如果是基于类似hash结构的话,那自然效率O(

js原生封装getClassName()方法-ie不支持getElementsByClassName,所以要自己实现获取类名为className的所有元素

<html> <head> <script type="text/javascript"> window.onload = function() { var topMenus = getClass('li','topMenu'); for(var i=0;i < topMenus.length; i++) { alert(topMenus[i].innerHTML); } } function getClass(tagName,classNam

交换a,b两个元素的值

交换两个元素的值,这是件很简单的事情,用一个中间变量temp保存一下其中一个元素的值就OK了. 我们可以这样写: 1 #include <stdio.h> 2 3 int main() 4 { 5 int a = 3, b = 5; 6 int temp = 0; 7 temp = a; 8 a = b; 9 b = temp; 10 return 0; 11 } 如果不使用第三个变量呢,我们可以通过数学的方法利用先求和再求差的方法来交换两个元素的值. 1 #include <stdio