Python算法详解
上QQ阅读APP看书,第一时间看更新

2.2.6 将序列分解为单独的变量

在Python程序中迭代处理列表或元组等序列时,有时需要统计最后几项记录以实现历史记录统计功能。下面的实例文件lishi.py演示了将序列中的最后几项作为历史记录的过程。

源码路径:daima\第2章\lishi.py

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('123.txt') as f:
          for line, prevlines in search(f, 'python', 5):
               for pline in prevlines:
                    print(pline)  # print (pline, end='')
               print(line)  # print (pline, end='')
               print('-' * 20)
q = deque(maxlen=3)
q.append(1)
q.append(2)
q.append(3)
print(q)
q.append(4)
print(q)

在上述代码中,对一系列文本行实现了简单的文本匹配操作,当发现有合适的匹配时,就输出当前的匹配行以及最后检查过的N行文本。使用deque(maxlen=N)创建了一个固定长度的队列。当有新记录加入而使得队列变成已满状态时,会自动移除最老的那条记录。当编写搜索某项记录的代码时,通常会用到含有yield关键字的生成器函数,它能够将处理搜索过程的代码和使用搜索结果的代码成功解耦开来。执行结果如图2-16所示。

图2-16 执行结果