2.2 数据结构
数据结构就是数据与数据之间的关系。在Python中,主要有列表、元组、字典、集合这4种数据结构,可理解为4种容器。这些数据结构之间是可以进行相互转换的;各结构内的元素可以通过遍历或其他方式获取具体值。
2.2.1 列表
列表是一个有序、可变、可重复的数据集,相当于C++、Java等语言中的数组,功能十分强大。在Python中,列表有很多优点,例如通过偏移来索引、支持嵌套、可变的类型。列表常用于以下操作:切片/索引、生成新列、删除、修改并重新赋值、成员关系的判断、列表推导、可转换为其他的数据结构等。
1.列表创建
可以使用以下两种方式创建空列表,代码如下:
#ch02d002.ipynb lst = [] #lst = list()
创建列表lst1、lst2,代码如下:
lst1 = ['上海','南京','常州','无锡','苏州'] lst2 = ['厦门','合肥','宁波','杭州'] lst3 = [0,1,2,3,4] lst4 = [[5,6,7,8]]
对列表lst1、lst2进行相加,代码如下:
lst1+lst2
返回的值如下:
['上海','南京','常州','无锡','苏州','厦门','合肥','宁波','杭州']
对列表lst1、lst3进行相加,代码如下:
lst1+lst3
在同一列表中允许存在不同的数据类型。返回的值如下:
['上海','南京','常州','无锡','苏州',0,1,2,3,4]
对列表lst1、lst4进行相加,代码如下:
lst1+lst4
在同一列表中允许存在多维的列表。返回的值如下:
['上海','南京','常州','无锡','苏州',[5,6,7,8]]
对列表lst2重复2次,代码如下:
lst2 * 2
返回的值如下:
['厦门','合肥','宁波','杭州','厦门','合肥','宁波','杭州']
2.列表函数
在Python中常用的列表函数见表2-1。
表2-1 Python中常用的列表函数
以上函数的x参数为对象,i参数为下标索引值(从0开始计算)。list.extend(seq)中的seq参数为另外一个列表。在Python的列表中,每个元素都有数字下标,代表在列表中的位置,这个位置就是索引,所以也常称为下标索引或下标索引值。
Python中列表函数append()应用举例,代码如下:
ln = [2,8,9,3,3,3,9,2,5,3,8,3] ln1 = [1,2,3,4] ln.append(ln1) ln
列表ln1将作为一个列表整体追加到列表ln的尾部。返回的值如下:
[2,8,9,3,3,3,9,2,5,3,8,3,[1,2,3,4]]
列表函数extend()应用举例,代码如下:
ln = [2,8,9,3,3,3,9,2,5,3,8,3] ln1 = [1,2,3,4] ln.extend(ln1) ln
将列表ln1中的全部元素追加到列表ln的尾部。返回的值如下:
[2,8,9,3,3,3,9,2,5,3,8,3,1,2,3,4]
列表函数insert()应用举例,代码如下:
ln = [2,8,9,3,3,3,9,2,5,3,8,3] ln.insert(3,2893) ln
在列表ln下标值3的位置(下标值从0开始)插入2893。返回的值如下:
[2,8,9,2893,3,3,3,9,2,5,3,8,3]
列表函数remove()应用举例,代码如下:
ln.remove(2893) ln
在列表ln中移除2893。返回的值如下:
[2,8,9,3,3,3,9,2,5,3,8,3]
列表函数pop()从列表ln中弹出最后一个值,代码如下:
ln.pop() ln
在列表ln中移除最后一个值3。返回的值如下:
[2,8,9,3,3,3,9,2,5,3,8]
从列表ln现存值中下标为3的位置弹出该值,代码如下:
ln.pop(3) ln
返回的值如下:
[2,8,9,3,3,9,2,5,3,8]
列表函数index(x)从列表ln现存值查找数值8的下标索引位置,代码如下:
ln.index(8)
返回值为1。其他函数用法不再一一举例。
3.列表访问
对于列表可利用索引或切片进行访问。创建列表如下:
lst = ['上海','南京','常州','无锡','苏州','厦门','合肥','宁波','杭州']
对其进行索引(Python中的下标索引值是从0开始计算的)。索引或切片时,可以为正数索引,也可以是负数索引;正数索引时,应用举例,代码如下:
lst[3]
返回的值为“无锡”。利用切片对列表进行访问,代码如下:
lst[3:7]
在Python中切片为左闭右开,返回的值如下:
['无锡','苏州','厦门','合肥']
应用举例,采用负数索引,代码如下:
lst[-5:-2]
返回的值如下:
['苏州','厦门','合肥']
在实际使用过程中,会经常对列表进行遍历,相关知识在循环结构部分进行讲解。
2.2.2 元组
元组是与列表类似的数据结构。元组是一个有序、不可变、可重复的数据集,相邻元素用逗号隔开。其区别在于:列表为中括号,元组为小括号,元组内的数据不可更改。可以使用以下两种方式创建空元组,代码如下:
tple = () #tple = tuple() type(tple)
创建一个值的元组,代码如下:
tpl = (2,) type(tpl)
返回的值为tuple。
注意:当元组中只有一个值时,值后面的逗号不能省略。
继续创建元组,代码如下:
tp = (2,8,9,3,3,3,9,2,5,3,8,3)
元组计算应用举例(右侧备注为返回的值),代码如下:
max(tp) #9 min(tp) #2 len(tp) #12 tp.count(3) #5
与列表一样,可以对元组进行索引或切片,代码如下:
tp[3] #3 tp[3:7] #(3,3,3,9)
如果对元组进行数据修改,则会报错提示。应用举例:
tp.reverse() tp
返回的报错提示如下:
AttributeError:'tuple'object has no attribute 'reverse'
2.2.3 字典
字典是一个无序、可变、可重复的数据集。字典也称键-值对,它是通过键来将一系列的值串接起来的,可以通过键从字典中获取指定项。字典是通过大括号来创建的。字典中的键必须是唯一且不可变的,键可以是数字、字符串或元组,但不能是列表,每个键与值之间用冒号隔开,每一对键值之间用逗号隔开。
1.字典创建
可以使用以下两种方式创建一个空字典,代码如下:
dic = dict() #dic = {}
继续创建字典,代码如下:
dic1 = {'蛋糕纸':'纸盒','苹果醋':'酸醋'} dic2 = {'语文':[95,85,],'数学':[93,87,]}
dic1中的值为字符串,dic2中的值为列表。查看这两个字典的数据类型,代码如下:
print(type(dic),type(dic1),type(dic2))
返回的值如下:
<class 'dict'><class 'dict'><class 'dict'>
在Python中,类与对象的区别:抽象的类(class),具体的对象(object)。
字典可以任意嵌套,值由列表及元组构成,代码如下:
查看其数据类型。
type(dct) #dict
查看字典的items,代码如下:
print(dct.items())
返回的值如下:
dct_items([('华北',[('华北','北京','DD001','蛋糕纸',2,2)]),('华东',[('华东','上海','D D003','苹果醋',2,2),('华东','宁波','DD004','钢化膜',1,1)])])
2.字典访问
对字典进行访问是通过键来读取的,代码如下:
dct['华北']
返回的值如下:
[('华北','北京','DD001','蛋糕纸',2,2)]
如果该键不存在,则会报错提示。应用举例:
dct['华西']
返回的错误提示如下:
KeyError Traceback(most recent call last) ~\AppData\Local\Temp/ipyKernel_9252/3152721856.py in<module> ---->1 dct['华西'] KeyError:'华西'
3.字典遍历
在字典遍历过程中,常用的3种方法为keys()、values()、items()。应用举例,遍历字典中的keys(),代码如下:
for k in dct.keys(): print(k)
运行以上代码,返回的值如下:
华北 华东
应用举例,遍历字典中的values(),代码如下:
for v in dct.values(): print(v)
运行以上代码,返回的值如下:
[('华北','北京','DD001','蛋糕纸',2,2)] [('华东','上海','DD003','苹果醋',2,2),('华东','宁波','DD004','钢化膜',1,1)]
应用举例,遍历字典中的键值items(),代码如下:
for i in dct.items(): print(i)
运行以上代码,返回的值如下:
('华北',[('华北','北京','DD001','蛋糕纸',2,2)]) ('华东',[('华东','上海','DD003','苹果醋',2,2),('华东','宁波','DD004','钢化膜',1,1)])
应用举例,通过遍历字典以获取具体的每个key值,代码如下:
for key,value in dct.items(): print(key)
在以上代码中循环变量key和value采用k、v或其他命名方式是允许的。返回的值如下:
华北 西南 华东
应用举例,通过遍历字典以获取具体的每个value值,代码如下:
for key,value in dct.items(): print(value)
返回的值如下:
[('华北','北京','DD001','蛋糕纸',2,2)] [('华东','上海','DD003','苹果醋',2,2),('华东','宁波','DD004','钢化膜',1,1)]
或者直接采用keys()、values()、items(),返回列表值,代码如下:
print(dct.keys()) #dict_keys数据类型 print(dct.values()) #dict_values数据类型 print(dct.items()) #dict_items数据类型
2.2.4 集合
在Python中,集合是一个无序、不可重复的数据集。集合有可变集合(set)和不可变集合(frozenset)两种。
(1)集合具备去重功能,当集合中存在重复的元素时会自动保留一个。
(2)集合是无序的,集合内各元素出现的位置每次都会不同。
(3)Python中的集合与数学中的集合概念类似,可以对其进行并集、交集、差集及补集等操作。
字典是通过大括号{}来创建的,相邻元素间用逗号(,)分开。可用set()创建空白集合。Python中集合常用的方法见表2-2。
表2-2 Python中集合常用的方法
以上方法中,a和b各自代表的是一个数据的集合,x代表的是集合中的元素。
集合中union()方法应用举例,代码如下:
a = {'上海','南京','常州','无锡','苏州'} b = {'南京','常州','宁波','杭州'} c = a.union(b) #a|b c
在新的集合c中,返回的是集合a与b的并集,返回的值如下:
{'上海','南京','宁波','常州','无锡','杭州','苏州'}
update()方法用于修改当前集合,可以将新的元素或集合添加到当前集合中(添加的过程中会自动添加重复的元素)。集合中update()方法应用举例,代码如下:
a = {'上海','南京','常州','无锡','苏州'} b = {'南京','常州','宁波','杭州'} a.update(b) #a| = b a
在修改后的集合a中,在添加集合b中所有元素的同时并删除了在a集合中重复的元素,返回的值如下:
{'上海','南京','宁波','常州','无锡','杭州','苏州'}
集合中intersection()方法应用举例,代码如下:
a = {'上海','南京','常州','无锡','苏州'} b = {'南京','常州','宁波','杭州'} c = a.intersection(b) #c = a&b c
在新的集合c中,返回的是集合a与b的交集,返回的值如下:
{'南京','常州'}
集合中intersection_update()方法应用举例,代码如下:
a = {'上海','南京','常州','无锡','苏州'} b = {'南京','常州','宁波','杭州'} a.intersection_update(b) #a& = b a
返回的值如下:
{'南京','常州'}
集合中add()方法应用举例,代码如下:
a = {'上海','南京','常州','无锡','苏州'} a.add('杭州') a
返回的值如下:
{'上海','南京','常州','无锡','杭州','苏州'}
超集检查issuperset()方法应用举例,代码如下:
a = {'上海','南京','常州','无锡','苏州'} b = {'南京','常州'} a.issuperset(b) #a>b
返回的值为True。