数据结构
8
8.1简介
数据结构是什么?它是计算机存储、组织数据的方式。Python 中有常用的数据结构: 列表、元组、字典和集合。
8.2 列表
列表(list)是一种按顺序存储的数据结构。
8.2.1 列表简介
还是那句话,计算机是对现实的抽象,让我们从身边找些数据结构的例子吧。
上面的这幅图是我们常见的排队的例子,先来的乘客排在前面,后面的紧跟其后。那么我们将这种结构抽象起来,它就是队列:一种按照顺序组织的结构。让我们回顾下排队时可能会有哪些场景:
Ø 场景一:乘务员站按照离车门最近的顺序检票,此时每检完一个,队列里就少一个人。
Ø 场景二:乘务员说后来的同志请站在队列的后面,此时队列里又多了人。
Ø 场景三:乘务员说大家按照个子大小排个队,排好了我再检票。
Ø 场景四:乘务员看排在第五位的人可疑,就没按照顺序检票,而是直接问那个人“这位同志你的票呢?”
Ø 场景五:乘务员说“这位抱小孩的先检票吧,各位理解下”
Ø ……
通过乘务员检票的方式,我们不能抽象出队列有如下几类常用的方法:
增加元素、删除元素、元素排序、索引访问、插入等等。
8.2.2 列表常用方法
这里我们通过一个简单的例子来揭开列表的神秘面纱。假设我们定义一个我的朋友军训的列表叫Myfriends,具体操作见下:
#增加、插入、删除元素
MyFriends=['hanmeimei','tom','lilei','polly','jim']
print("我当前朋友的排列顺序是:\t"+str(MyFriends))
MyFriends.append('lily')
print("我当前朋友的排列顺序是:\t"+str(MyFriends)+"新增的lily在最后")
MyFriends.insert(2,'lucy')
print("lucy插到第三个位置后,我当前朋友的排列顺序是:\t"+str(MyFriends))
#访问List里的元素
print("我当前朋友排在第一个的是:\t"+str(MyFriends[0]))
print("我当前朋友排在最后一个的是:\t"+str(MyFriends[-1]))
#注意这里是左闭右开,即右边取不到
print("截取后,我当前朋友的排列顺序是:\t"+str(MyFriends[2:-1]))
print("我当前朋友的排列的长度是:\t"+str(len(MyFriends)))
forfriend in MyFriends:
print(str(friend)+"排在第"+str(MyFriends.index(friend)+1)+"位"+",它对应的索引号是"+str(MyFriends.index(friend)))
#删除指定的元素lucy
MyFriends.remove('lucy')
print("删除lucy后,我当前朋友的排列顺序是:\t"+str(MyFriends))
MyFriends.pop()
print("pop最后一个元素后,我当前朋友的排列顺序是:\t"+str(MyFriends))
delMyFriends[3]
print("删除第4个元素后,我当前朋友的排列顺序是:\t"+str(MyFriends))
#排序、反转
MyFriends.reverse()
print("反转后,我当前朋友的排列顺序是:\t"+str(MyFriends))
MyFriends.sort()
print("排序后,我当前朋友的排列顺序是:\t"+str(MyFriends))
来张表格更直观些:
函数名 | 功能介绍 | 示例 |
append | 在列表后追加元素 | lista.append('lily') |
insert | 在指定位置增加元素 | lista.insert(2,'lucy') |
extend | 通过另外个list扩充当前list | lista.extend(listb) |
remove | 删除list里指定的元素 | lista.remove('lucy') |
del | 删除list里的元素或则整个list | del lista[2] del lista |
pop | 删除list里最后一个元素 | lista.pop() |
reverse | list里的顺序逆转 | lista.reverse() |
sort | list里的元素排序 | lista.sort() |
max | list里的最大值 | max(lista) |
min | list里的最大值 | min(lista) |
len | list的长度 | len(lista) |
count | list里某个元素出现的次数统计 | lista.count('lucy') |
index | list里某个元素出现的索引号 | lista.index('lucy') |
cmp | 比较两个列表的元素 | cmp(lista,listb) |
list | 将一个元组转为list | list(tupleA) |
…… | …… | …… |
8.3 元组
理解了列表,那么元组(tuple)就很好理解,它跟列表很类似,但不能修改元素的值。打个比方,元组是中国的一段朝代顺序表dynasty: 唐、宋、元、明、清,那么显然这个列表是不能更新的,顺序一致都是这样,除非时光可以倒流。
一般我们这样元组定义:
tuplea =('abcd', 786 , 2.23, 'john', 70.2 ),这里元素通过小括号(“()”)包裹起来,而列表则是通过中括号包(“[]”)裹起开。
鉴于元组类似于列表,这里不做详细展开。如下附录了元组里常用的方法:
函数名 | 功能介绍 | 示例 |
cmp | 比较两个元组里的元素 | cmp(tuplea,tupleb) |
del | 删除整个tuple | del tuplea |
max | tuple里的最大值 | max(tuplea) |
min | tuple里的最小值 | min(tuplea) |
len | tuple的长度 | len(tuplea) |
tuple | list转tuple | tuple(lista) |
…… | …… | …… |
8.4 字典
字典(dictionary)是一种灵活的通过key=>value(键值)来存储数据的结构。
8.4.1 字典简介
这里有一个最容易理解的例子就是我们的身份证号,它就相当于一个key,通过他可以找到你的姓名,年龄,地址等信息。这里为了简单,我们仅仅假设key是身份证号,value是姓名,这个简单的字典就叫id.当然如果你对之前的list章节理解了,其实你可以假设这里的key是身份证,而value是一个list,它里面有元素:姓名、年龄、地址等。好了,围绕这个字典id,我们能想到它的哪些特点呢?
首先身份证号是唯一的
其次这里的身份证号是不可以变的,即便户口迁了,身份证还是没变
再有身份证号对应的姓名是可以重复的
一般我们通过key:value,然后以大括号包裹起来定义一个字典:
dicta = {'Alice':'2341', 'Beth': '9102', 'Cecil': '3258','John': '3258'}
dictb = {'Alice':'2341', 'Beth': '9102', 'Cecil': '3258'}
8.4.2 字典常用方法
这里通过表格列举下字典里常用的方法:
函数名 | 功能介绍 | 示例 |
str | 以字符串形式显示字典 | str(dicta) |
cmp | 比较两个字典里的元素 | cmp(dicta,dictb) |
copy | 返回一个字典的拷贝 | dicta.copy() |
clear | 清空dict里的所有元素 | dicta.clear() |
get | 通过key找对应的value,如果没有可指定默认值 | dicta.get('lily',default= '莉莉') |
has_key | 判断字典里是否有某个key | dicta.has_key('lily') |
values | 以列表形式返回字典里的元素 | for i in dicta.values: print(i) |
keys | 以列表形式返回字典里的键 | for i in dicta.keys: print(i) |
update | 把另外个字典里的键/值对更新到当前字典里 | dicta.update(dictb) |
8.5 集合
集合是无序的数据的组合。它跟list 很像,但是set的元素没有重复,而且是无序的。
8.5.1 集合简介
这里集合不是个新概念,它对应数学里的集合,可以进行交、差、并等操作。
一般我们通过set关键字结合小括号、中括号来定一个一个集合:
seta =set(['A', 'B', 'C'])
集合一般分为两类:可变集合(set)和不可变集合(frozenset)
可变集合可对集合内元素进行改变,而不可变集合则不行。
8.5.2 集合常用方法
函数名 | 功能介绍 | 示例 |
add | 像集合里添加元素 | s = set('beginman') s.add(0) |
update | 更新集合 | s.update('MM') |
remove | 删除集合的里的指定元素 | s.remove('D') |
|/union | 两个集合的并集 | s1=set('begin') s2=set('man') s3=s1|s2 s4= s1.union(s2) |
&/intersection | 两个集合的交集 | s1=set('begin') s2=set('man') s3=s1&s2 s4=s1.intersection(s2) |
-/difference | 两个集合的补集 | s1=set('begin') s2=set('man') s3=s1-s2 s4=s1.difference(s2) |
list | 集合转list | s1=set('begin') |
tuple | 集合转tuple | s1=set('begin') |
str | 集合的字符串表示 | s1=set('begin') |
copy | 返回一个集合的拷贝 | s1=set('begin') s1.copy() |
issubset | 判断一个集合是另外个的子集 | s1=set('begin') s2=set('man') s1.issubset(s2) |
clear | 清空集合里的元素 | s1=set('begin') s1.clear() |
pop | 删除集合中任何一个元素,并返回它 | s1=set('begin') s1.pop() |
discard | 如果是集合中的元素就删除它 | s1=set('begin') s1.discard() |
8.6 总结
通过本章的学习我们知道了Python 内建的数据结构以及他们的常用方法,这些数据结构将是编写程序时至关重要的组成部分。