加入收藏 | 设为首页 | 会员中心 | 我要投稿 PHP编程网 - 黄冈站长网 (http://www.0713zz.com/)- 数据应用、建站、人体识别、智能机器人、语音技术!
当前位置: 首页 > 运营中心 > 建站资源 > 优化 > 正文

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

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

Python内置了许多非常有用的数据结构,比如列表(list)、集合(set)以及字典(dictionary)。就绝大部分情况而言,我们可以直接使用这些数据结构。但是,通常我们还需要考虑比如搜索、排序、排列以及筛选等这一类常见的问题。

本篇文章将介绍3种常见的数据结构和同数据有关的算法。此外,在collections模块中也包含了针对各种数据结构的解决方案。

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

1. 将序列分解为单独的变量

(1) 问题

我们有一个包含 N 个元素的元组或序列,现在想将它分解为N个单独的变量。

(2) 解决方案

任何序列(或可迭代的对象)都可以通过一个简单的赋值操作来分解为单独的变量。唯一的要求是变量的总数和结构要与序列相吻合。例如:

  1. >>> p = (4, 5) 
  2. >>> x, y = p 
  3. >>> x 
  4. >>> y 
  5. >>> 
  6. >>> data = [ 'ACME', 50, 91.1, (2012, 12, 21) ] 
  7. >>> name, shares, price, date = data 
  8. >>> name 
  9. 'ACME' 
  10. >>> date 
  11. (2012, 12, 21) 
  12. >>> name, shares, price, (year, mon, day) = data 
  13. >>> name 
  14. 'ACME' 
  15. >>> year 
  16. 2012 
  17. >>> mon 
  18. 12 
  19. >>> day 
  20. 21 
  21. >>> 

如果元素的数量不匹配,将得到一个错误提示。例如:

  1. >>> p = (4, 5) 
  2. >>> x, y, z = p 
  3. Traceback (most recent call last): 
  4.  File "<stdin>", line 1, in <module> 
  5. ValueError: need more than 2 values to unpack 
  6. >>> 

(3) 讨论

实际上不仅仅只是元组或列表,只要对象恰好是可迭代的,那么就可以执行分解操作。这包括字符串、文件、迭代器以及生成器。比如:

  1. >>> s = 'Hello' 
  2. >>> a, b, c, d, e = s 
  3. >>> a 
  4. 'H' 
  5. >>> b 
  6. 'e' 
  7. >>> e 
  8. 'o' 
  9. >>> 

当做分解操作时,有时候可能想丢弃某些特定的值。Python并没有提供特殊的语法来实现这一点,但是通常可以选一个用不到的变量名,以此来作为要丢弃的值的名称。例如:

  1. >>> data = [ 'ACME', 50, 91.1, (2012, 12, 21) ] 
  2. >>> _, shares, price, _ = data 
  3. >>> shares 
  4. 50 
  5. >>> price 
  6. 91.1 
  7. >>> 

但是请确保选择的变量名没有在其他地方用到过。

2. 从任意长度的可迭代对象中分解元素

(1) 问题

需要从某个可迭代对象中分解出N个元素,但是这个可迭代对象的长度可能超过N,这会导致出现“分解的值过多(too many values to unpack)”的异常。

(2) 解决方案

Python的“*表达式”可以用来解决这个问题。例如,假设开设了一门课程,并决定在期末的作业成绩中去掉第一个和最后一个,只对中间剩下的成绩做平均分统计。如果只有4个成绩,也许可以简单地将4个都分解出来,但是如果有24个呢?*表达式使这一切都变得简单:

  1. def drop_first_last(grades): 
  2.  first, *middle, last = grades 
  3.  return avg(middle) 

另一个用例是假设有一些用户记录,记录由姓名和电子邮件地址组成,后面跟着任意数量的电话号码。则可以像这样分解记录:

  1. >>> record = ('Dave', 'dave@example.com', '773-555-1212', '847-555-1212') 
  2. >>> name, email, *phone_numbers = user_record 
  3. >>> name 
  4. 'Dave' 
  5. >>> email 
  6. 'dave@example.com' 
  7. >>> phone_numbers 
  8. ['773-555-1212', '847-555-1212'] 
  9. >>> 

(编辑:PHP编程网 - 黄冈站长网)

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

热点阅读