Python的数据结构和算法
解决方案
拓展
解决方案
拓展
什么是序列
序列的例子
案例一:将序列分解为单独的变量
案例二:从任意长度的可迭代对象是分解元素
Python的数据结构和算法
Python内置了很多有用的数据结构,比如列表(list),集合(set),字典(dictionary),绝大情况下我们可以直接使用这些数据结构,但有些特殊需求需要我们考虑,比如搜索,排序,排列,筛选等。本次内容我们着重探讨常见的数据结构和数据结构相关的算法。
## 什么是序列
维基百科上如此解释,我们可参考一二:
众所周知,最早时期计算机是为了解决数学而诞生,序列是数学的一种,被排成一列的对象或事件;这样,每个元素不是在其它元素前,就是在其它元素后。因此,序列是有顺序的元素的集合。
## 序列的例子
有限序列
(C, Y, R)是一个字母序列,顺序是C第一,Y第二,R第三。
无限序列
(a1, a2, .., an) 无限个元素按一定顺序的排列
空序列
() 不包括任何元素的序列
案例一:将序列分解为单独的变量
我们有一个包含N个元素的元组或序列,现在想将它分解为N个单独的变量
解决方案
任何序列或可迭代对象都可以通过简单的赋值操作来分解为单独的变量,唯一要求是变量和总数和结构需要和序列相吻合。
In [1]:p= (4,5) In [2]: x, y =p In [3]: xOut[3]:4 In [4]: yOut[4]:5 In [5]: m, n,q=p---------------------------------------------------------------------------ValueError Traceback (most recent call last)in()---->1m, n,q=p ValueError: not enough values to unpack (expected3, got2)
In[6]:data= ['ACME',50,91.1, (2012,12,21) ] In[7]:name, shares, price, date =data In[8]:nameOut[8]:'ACME' In[9]: priceOut[9]:91.1 In[10]: dateOut[10]: (2012,12,21) In[11]:name, shares, price, (year, month, day) =data In[12]: yearOut[12]:2012 In[13]: monthOut[13]:12
## 拓展
如果想丢弃指定某些特定值如何操作
In[14]: _, shares, price, _ =data In[15]: sharesOut[15]:50 In[16]: priceOut[16]:91.1
案例二:从任意长长度的可迭代对象是分解元素
对于可迭代对象长度可长的情况,可能会出现“分解的值过多(too many values to unpack)”的异常
## 解决方案
python的*表达式可以解决该类问题。如期末成绩平均值统计,每班80个学生,分别去掉第一名和最后一名求平均值,这里就很方便了。
In [24]: grades = (42,55,64,74,83,90,93,95,98,99,99,99) In [25]: def drop_frist_last(grades):...:first, *middle,last= grades...:returnavg(middle)...: In [26]:middleOut[26]: [55,64,74,83,90,93,95,98,99,99]
In[27]:record= ['Dave','dave@example.com','773-555-1212','847-555-1212'] In[28]:name, email, *phone_num =record In[29]:nameOut[29]:'Dave' In[30]: emailOut[30]:'dave@example.com' In[31]: phone_numOut[31]: ['773-555-1212','847-555-1212']
## 拓展
通过split切割字符串
In[35]:line= '_hidd:*:261:261:HID Service User:/var/empty:/usr/bin/false' In[36]: uname, *fields, homedir,sh=line.split(':') In[37]: homedirOut[37]: '/var/empty' In[38]:shOut[38]: '/usr/bin/false'
指定多个丢弃变量
In[39]:data= ['ACME',50,91.1, (2012,12,21) ] In[40]:name, *_, (*_, year) =data In[41]:data= ['ACME',50,91.1, (12,21,2012) ] In[42]:name, *_, (*_, year) =data In[43]: yearOut[43]:2012