加入收藏 | 设为首页 | 会员中心 | 我要投稿 衢州站长网 (https://www.0570zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 建站 > 正文

Python编程中3个常用的数据结构和算法

发布时间:2019-04-17 04:02:54 所属栏目:建站 来源:程序员爱学习
导读:副标题#e# Python内置了许多非常有用的数据结构,比如列表(list)、集合(set)以及字典(dictionary)。就绝大部分情况而言,我们可以直接使用这些数据结构。但是,通常我们还需要考虑比如搜索、排序、排列以及筛选等这一类常见的问题。 本篇文章将介绍3种常见

*分解操作和各种函数式语言中的列表处理功能有着一定的相似性。例如,如果有一个列表,可以像下面这样轻松将其分解为头部和尾部:

  1. >>> items = [1, 10, 7, 4, 5, 9] 
  2. >>> head, *tail = items 
  3. >>> head 
  4. >>> tail 
  5. [10, 7, 4, 5, 9] 
  6. >>> 

在编写执行这类拆分功能的函数时,人们可以假设这是为了实现某种精巧的递归算法。例如:

  1. >>> def sum(items): 
  2. ... head, *tail = items 
  3. ... return head + sum(tail) if tail else head 
  4. ... 
  5. >>> sum(items) 
  6. 36 
  7. >>> 

但是请注意,递归真的不算是Python的强项,这是因为其内在的递归限制所致。因此,最后一个例子在实践中没太大的意义,只不过是一点学术上的好奇罢了。

3. 保存最后N个元素

(1) 问题

我们希望在迭代或是其他形式的处理过程中对最后几项记录做一个有限的历史记录统计。

(2) 解决方案

保存有限的历史记录可算是collections.deque的完美应用场景了。例如,下面的代码对一系列文本行做简单的文本匹配操作,当发现有匹配时就输出当前的匹配行以及最后检查过的N行文本。

  1. from collections import deque 
  2. def search(lines, pattern, history=5): 
  3.  previous_lines = deque(maxlen=history) 
  4.  for line in lines: 
  5.  if pattern in line: 
  6.  yield line, previous_lines 
  7.  previous_lines.append(line) 
  8. # Example use on a file 
  9. if __name__ == '__main__': 
  10.  with open('somefile.txt') as f: 
  11.  for line, prevlines in search(f, 'python', 5): 
  12.  for pline in prevlines: 
  13.  print(pline, end='') 
  14.  print(line, end='') 
  15.  print('-'*20) 

(3) 讨论

如同上面的代码片段中所做的一样,当编写搜索某项记录的代码时,通常会用到含有yield关键字的生成器函数。这将处理搜索过程的代码和使用搜索结果的代码成功解耦开来。如果对生成器还不熟悉,请参见4.3节。

(编辑:衢州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

推荐文章
    热点阅读