Py程序基础及设计 1_第1页
Py程序基础及设计 1_第2页
Py程序基础及设计 1_第3页
Py程序基础及设计 1_第4页
Py程序基础及设计 1_第5页
已阅读5页,还剩106页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Python语言程序设计基础12-8月-26第五章组合数据结构第5章组合数据结构本章学习目标掌握列表与元组的特点及其常用方法掌握有序序列的索引、切片等常用操作掌握字典的特点及其常用方法掌握集合的特带及其常用方法掌握运算符和内置函数对上述各类型数据的操作理解上述组合类型的不同适用场景目录1组合数据类型——元组组合数据类型——列表2

组合数据类型——字典3组合数据类型——集合4组合数据类型应用案例55.1列表列表(list)由一系列按特定顺序排列的元素组成,是Python中使用最频繁的组合数据类型。列表的元素可以是数字、字符串等基本数据类型,也可以是列表、元组、字典等组合数据类型。列表可用于存放一组数据,比如:一个班级所有学生的成绩。通过Python提供的内置函数以及列表对象的方法,可以方便的对一组数据进行求平均值、求最大值、求最小值等数据分析和统计操作,以及数据的查找和排序等操作。5.1.1列表的创建1.使用[]创建>>>emptyL=[]#创建空列表emptyL>>>days=["Sun","Mon","Tues","Wed","Thur","Fri","Sat"]>>>book=["Python程序设计","王丽",45.0,2023,"清华大学出版社"]>>>employees=[["张伟",24],["李浩",37],["刘军",52]]5.1.1列表的创建2.使用list()函数创建>>>emptyL=list()#创建空列表>>>numChar=list("0123456789")#通过字符串创建列表>>>numChar['0','1','2','3','4','5','6','7','8','9']>>>nums=list(range(10,40,5))#通过range对象创建列表,其元素为10~35的5的倍数>>>nums[10,15,20,25,30,35]>>>mybook=list(book)#通过已有的列表book创建新列表mybook,相当于列表的复制>>>mybook['Python程序设计','王丽',39.0,2023,'清华大学出版社']5.1.1列表的创建3.使用列表推导式创建>>>squares=[i*iforiinrange(10)]>>>squares[0,1,4,9,16,25,36,49,64,81]>>>importrandom>>>rand_nums=[random.randint(1,6)foriinrange(8)]>>>rand_nums[2,2,6,3,5,5,3,1]>>>matrix=[[i*jforiinrange(2,4)]forjinrange(1,4)]>>>matrix[[2,3],[4,6],[6,9]]5.1.2列表元素的访问1.访问单个元素直接使用元素在列表中的索引值即可访问列表的单个元素>>>days=["Sun","Mon","Tues","Wed","Thur","Fri","Sat"]>>>days[-1] #访问days列表的最后一个元素'Sat'>>>book=["Python程序设计","王丽",45.0,2023,"清华大学出版社"]>>>book[2] #访问book列表中书籍的单价45.0>>>employees=[["张伟",24],["李浩",37],["刘军",52]]>>>employees[0]#访问employees列表中的第一个员工"张伟"的信息['张伟',24]>>>employees[0][1]#访问employees列表中的第一个员工"张伟"的年龄信息245.1.2列表元素的访问2.访问多个元素使用方括号切片的方式可以一次性访问列表中的多个元素>>>days=["Sun","Mon","Tues","Wed","Thur","Fri","Sat"]>>>days[1:6]#访问工作日的星期缩写['Mon','Tues','Wed','Thur','Fri']5.1.2列表元素的访问3.遍历所有元素使用for循环可方便的遍历列表的所有元素,并根据需要进行适当的操作。>>>days=["Sun","Mon","Tues","Wed","Thur","Fri","Sat"]>>>fordayindays: print(day,end="----")Sun----Mon----Tues----Wed----Thur----Fri----Sat----5.1.3列表元素的增删改1.添加列表元素

使用列表的append()方法和insert()方法都可以向列表添加一个新元素。不同的是,append()是在列表的末尾添加,而insert()方法是在列表的指定位置前面插入新元素。>>>studClass1=["王倩"]>>>studClass1.append("孙杨")#在studClass1的最末尾添加学生"孙杨">>>studClass1.insert(0,"刘洋")#在studClass1的开头添加学生"刘洋">>>studClass1['刘洋','王倩','孙杨']5.1.3列表元素的增删改1.添加列表元素

使用列表的extend()方法可以将一个列表中的所有数据元素添加到当前列表中,实现一次性向列表添加多个元素。>>>studAll=[]>>>studClass1=["刘洋","王倩","孙杨"]>>>studClass2=["李元苏","赵鹏宇"]>>>studAll.extend(studClass1)#将1班学生的信息添加到studAll列表>>>studAll.extend(studClass2)#将2班学生的信息添加到studAll列表>>>studAll['刘洋','王倩','孙杨','李元苏','赵鹏宇']5.1.3列表元素的增删改1.添加列表元素

也可以使用“+=”运算符实现对列表本身的新增操作。>>>studAll=[]>>>id(studAll)#新增之前,查看列表的id值1757967952776>>>studAll+=studClass1 #将1班学生的信息添加到studAll列表>>>studAll+=studClass2#将2班学生的信息也添加到studAll列表>>>studAll['刘洋','王倩','孙杨','李元苏','赵鹏宇']>>>id(studAll)#新增之后,查看列表的id值17579679527765.1.3列表元素的增删改2.删除列表元素

使用列表的remove()方法或pop()方法每次可删除一个指定的列表元素。不同的是:

remove()方法通过给出元素的值来指定删除,而pop()方法通过给出元素在列表中的位置索引来指定删除。

remove()方法仅从列表中删除指定元素,而pop()方法除了从列表中删除指定元素,还会返回被删除元素的值,可用于后面的使用。5.1.3列表元素的增删改2.删除列表元素

>>>studAll=['刘洋','王倩','孙杨','李元苏','赵鹏宇']>>>studAll.remove("刘洋")#删除"刘洋">>>studAll.pop(1)#删除并返回studAll中索引为1的数据'孙杨'>>>studAll.pop()#删除并返回studAll中的最后一个数据'赵鹏宇'>>>studAll['王倩','李元苏']5.1.3列表元素的增删改2.删除列表元素

使用del语句配合列表的切片可以一次删除多个元素。>>>studAll=['王倩','孙杨','李元苏','赵鹏宇','刘洋']>>>delstudAll[1:3]#从列表中删除"孙杨"和"李元苏"的信息>>>studAll['王倩','赵鹏宇','刘洋‘]5.1.3列表元素的增删改2.删除列表元素

如果要一次性删除列表中的所有元素,可以直接使用列表的clear()方法>>>studAll.clear()#删除所有元素,成为空列表>>>studAll[]5.1.3列表元素的增删改3.修改列表元素通过赋值语句可对列表元素的单个值进行更新>>>studAll=["刘洋","王倩","孙杨","李元苏","赵鹏宇"]>>>studAll[0]="刘阳"#将studAll中"刘洋"改为"刘阳">>>studAll['刘阳','王倩','孙杨','李元苏','赵鹏宇']5.1.4列表的常用操作1.列表元素的统计

使用内置函数len()可以统计列表元素的个数,sum()可以统计列表元素的和,max()和min()可以统计列表元素的最大值和最小值。使用列表的count()方法可以统计指定元素在列表中出现的次数。例如:统计studAll列表中学生总人数,以及同名学生的人数。>>>studAll=["刘洋","王倩","孙杨","李元苏","赵鹏宇","刘洋"]>>>print("一共有{}名学生".format(len(studAll)))一共有6名学生>>>print("名字叫'刘洋'的有{}人".format(studAll.count("刘洋")))名字叫'刘洋'的有2人5.1.4列表的常用操作2.列表元素的查找

使用in/notin运算可以查找元素是否存在于列表中,使用列表的index()方法可以在指定范围内查找指定元素并返回该元素第一次出现的索引位置。

例如:假设列表studAll中名字出现的顺序代表学生排队的顺序,请在studAll中查找所有名叫"刘洋"的学生在队伍中的位置信息。5.1.4列表的常用操作2.列表元素的查找>>>studAll=["刘洋","王倩","孙杨","李元苏","赵鹏宇","刘洋"]>>>i=studAll.index("刘洋")#返回"刘洋"的第一次出现的位置>>>i0>>>print("第1个刘洋在队伍中的位置为:",i+1)第1个刘洋在队伍中的位置为:1>>>i=studAll.index("刘洋",i+1,)#在剩下的队伍中查找下一个"刘洋">>>i5>>>print("第2个刘洋在队伍中的位置为:",i+1)第2个刘洋在队伍中的位置为:65.1.4列表的常用操作3.列表元素的映射

内置函数map()可将列表中的元素按统一的方式进行批量映射处理,大幅提高了对列表元素的处理效率。在数据输入时,经常会使用map()来处理经过字符串的split()方法处理得到的列表。

例如:根据studAll中的数据统计三个字名字的学生的人数。>>>studAll=["刘洋","王倩","孙杨","李元苏","赵鹏宇","刘洋"]>>>studNameLen=list(map(len,studAll))>>>studNameLen[2,2,2,3,3,2]>>>print("名字中含有3个字的学生有{}人".format(studNameLen.count(3)))名字中含有3个字的学生有2人

5.1.4列表的常用操作4.列表元素的排序与反转

列表的sort()方法提供了对列表自身元素的排序。例如:>>>studAllAge=[18,22,19,17,16,20]>>>studAllAge.sort()#将studAllAge中的元素默认按升序排序>>>print("最小年龄{},最大年龄{}".format(studAllAge[0],studAllAge[-1]))最小年龄16,最大年龄225.1.4列表的常用操作4.列表元素的排序与反转

通过参数reverse可指定按升序还是降序排序,通过参数key可指定排序依据。例如:>>>studAllAge=[18,22,19,17,16,20]>>>studAllAge.sort(reverse=True)#指定studAllAge中的元素按降序排序>>>studAllAge[22,20,19,18,17,16]>>>studAll=["刘洋","王倩","孙杨","李元苏","赵鹏宇","刘洋","上官云飞"]>>>studAll.sort(key=len,reverse=True) #按姓名长度的降序排序>>>studAll['上官云飞','李元苏','赵鹏宇','刘洋','王倩','孙杨','刘洋']5.1.4列表的常用操作4.列表元素的排序与反转列表的sort()方法与内置函数sorted()均能实现排序功能。列表的sort()方法是在列表自身上对元素进行排序,并不会生成新的列表。而内置函数sorted()会生成一个新的列表,新列表中的元素是按指定要求排好序的,sorted()操作不会改变原列表中的数据。>>>studAllAge=[18,22,19,17,16,20]>>>lstAges=sorted(studAllAge,reverse=True)>>>lstAges[22,20,19,18,17,16]>>>studAllAge[18,22,19,17,16,20]5.1.4列表的常用操作4.列表元素的排序与反转相比列表的sort()方法的排序功能,列表的reverse()方法仅将列表自身元素的顺序进行反转。>>>studAllAge=[18,22,19,17,16,20]>>>studAllAge.reverse()#将studAllAge中的元素顺序反转>>>studAllAge[20,16,17,19,22,18]5.1.4列表的常用操作5.列表的复制列表的复制是指根据原列表内容生成其副本列表,副本列表的内容与原列表内容完全相同,并且对原列表和副本列表可以各自独立进行增删改查操作,互不影响。可使用内置函数list()、列表的切片方法或者列表的copy()方法实现列表的复制。>>>studAll=['刘洋','王倩','孙杨','李元苏','赵鹏宇']>>>studAll1=list(studAll)#使用list()复制生成stuAll1>>>studAll2=studAll[:] #使用列表的切片方法复制生成studAll2>>>studAll3=studAll.copy() #使用列表的copy()方法生成studAll3>>>id(studAll1),id(studAll2),id(studAll3) (2779473988488,2779473987784,2779469070472)5.1.4列表的常用操作5.列表的复制>>>delstudAll1[0]#删除studAll1中的'刘洋'>>>studAll1['王倩','孙杨','李元苏','赵鹏宇']>>>delstudAll2[1]#删除studAll2中的'王倩'>>>studAll2['刘洋','孙杨','李元苏','赵鹏宇']>>>delstudAll3[2]#删除studAll3中的'孙杨'>>>studAll3['刘洋','王倩','李元苏','赵鹏宇']目录1组合数据类型——元组组合数据类型——列表2

组合数据类型——字典3组合数据类型——集合4组合数据类型应用案例55.2元组Python的元组(tuple)与列表类似,不同之处在于元组是不可变类型,一旦创建,就不能修改了。在实际使用过程中,如果确定不需要修改和操作数据,则使用元组比使用列表更能保证数据的安全。Python语言中,元组用一对圆括号“()”进行标识,元组的元素之间使用“,”进行分隔。可以使用多种方式创建元组。5.2.1元组的创建1.使用()创建>>>emptyT=() #创建空元组>>>oneT=(1900,) #创建只有一个元素的元组>>>curChiCap=("零","壹","贰","叁","肆","伍","陆","柒","捌","玖","拾","佰","仟","万","亿")>>>studInfo=("23100","张伟","男",24,True)5.2.1元组的创建2.使用tuple()函数创建>>>emptyT=tuple()#创建空元组>>>curChiCap=tuple("零壹贰叁肆伍陆柒捌玖拾佰仟万亿")#通过字符串创建>>>studInfoTitle=tuple(["学号","姓名","性别","年龄","党员否"])#通过列表创建5.2.1元组的创建3.通过赋值语句创建直接使用赋值语句时,不加圆括号,数据项之间以逗号分隔,也可以创建。>>>numbers=89,75,96

如果函数有多个返回值,则采用元组的形式返回计算的结果。比如:Python的内置函数divmod(x,y)以元组的形式返回x除以y的商和余数。>>>result=divmod(27,4)>>>result(6,3)5.2.2元组元素的访问1.访问单个元素>>>curChiCap=tuple("零壹贰叁肆伍陆柒捌玖拾佰仟万亿")>>>curChiCap[-5:]#访问人民币大写单位名称的后5个。('拾','佰','仟','万','亿')

2.访问多个元素>>>result=divmod(27,4)>>>print("27除以4的商是:{},余数是:{}".format(result[0],result[1]))27除以4的商是:6,余数是:3

5.2.2元组元素的访问3.遍历所有元素

>>>studInfoTitle=tuple(["学号","姓名","性别","年龄","党员否"])>>>studInfo=("23100","张伟","男",24,True)>>>fortitleinstudInfoTitle: print(title,end="\t")学号 姓名 性别 年龄 党员否

5.2.3元组的常用操作与列表类似,可以使用内置函数len()、sum()、max()、min()以及元组的count()方法对元组进行相关数据的统计操作。也可以使用in/notin运算和元组的index()方法查找元素是否存在以及获取元素在元组中的位置。说明:由于Python元组是不可变类型,不能对元组的元素进行增删改等操作,因此元组仅提供了count()和index()两个方法。

5.2.4元组与列表的区别与联系1.元组与列表的共性(1)元组和列表都是有序序列类型,均支持通过索引、切片对元素进行访问。(2)元组和列表均提供count(x)方法统计元素x出现的次数和index(x)方法获取元素x的索引;(3)元组和列表都可以使用len()、sum()、max()、min()等内置函数获取元素的个数、元素的和、元素的最大值及最小值等统计数据。(4)+、*、in/notin运算符均可作用于元组和列表。

5.2.4元组与列表的区别与联系2.元组与列表的区别(1)定义方法不同:列表使用方括号定义,而元组使用圆括号定义。(2)元组是不可变类型,一旦创建就不能对元素进行增加、删除和修改操作。因此,元组适合于存储仅用于读取和查找而不需要改变的数据集。而列表是可变类型,可以通过切片以及列表对象丰富的方法进行元素的增加、删除和修改等操作,因此列表适合存储需要频繁进行修改的数据集,操作更加方便。(3)元组的访问速度比列表更快,因此使用元组处理只需读取的数据效率会更高。(4)由于元组的元素不允许被修改,因此元组更安全可靠。(5)作为不可变类型,元组可用作字典的键,也可以作为集合的元素,而列表不可用作字典的键,也不可以作为集合的元素。

5.2.4元组与列表的区别与联系3.列表与元组的相互转化使用tuple()方法可以将列表转换为元组,使用list()方法可以将元组转换为列表。

>>>days=("Sun","Mon","Tues","Wed","Thur","Fri","Sat")>>>tDays=list(days)>>>print(tDays)['Sun','Mon','Tues','Wed','Thur','Fri','Sat']>>>foriinrange(len(tDays)): tDays[i]+='.'>>>days=tuple(tDays)>>>print(days)('Sun.','Mon.','Tues.','Wed.','Thur.','Fri.','Sat.')目录1组合数据类型——元组组合数据类型——列表2组合数据类型——字典3组合数据类型——集合4组合数据类型应用案例55.3字典字典是典型的映射类型,其数据元素为“键:值”的形式,元素之间以英文逗号“,”分隔。字典元素的“值”是通过元素的“键”来访问的。由于“键”是访问数据的关键信息,因此“键”必须具有唯一性,且不可改变。在Python中,只有不可变类型的数据才可以作为字典元素的“键”,而字典元素的“值”可以是任意类型。5.3.1字典的创建1.使用{}创建>>>emptyD={} #创建空字典>>>dictGDP1={"湖北":40237,"山东":68125,"四川":43387}>>>dictGDP2={"湖北":(6.0,5.6),"山东":(6.0,6.2),"四川":(6.5,5.5)}>>>dictGDP3={"湖北":{"武汉":14163,"襄阳":4225}, "山东":{"青岛":11769,"济南":9229}, "四川":{"成都":16114,"绵阳":2719}}>>>dictTriangle={(3,4,5):True,(4,2,3):False}5.3.1字典的创建2.使用dict()函数创建>>>emptyD=dict()#创建空字典>>>dictGDP4=dict(广东=96161,浙江=59182,海南=5274)#采用关键字参数形式创建>>>dictGDP4{'广东':96161,'浙江':59182,'海南':5274}>>>dictAbbr=dict([("湖北","鄂"),("湖南","湘")])#采用键值对元组组成的列表创建>>>dictAbbr{'湖北':'鄂','湖南':'湘'}5.3.1字典的创建3.使用字典推导式创建>>>GDP={value:keyforkey,valueindictGDP1.items()}>>>GDP{40237:'湖北',68125:'山东',43387:'四川'}>>>PasswordTable={chr(i+65):chr((i+13)%26+65)foriinrange(26)}>>>PasswordTable{'A':'N','B':'O','C':'P','D':'Q','E':'R','F':'S','G':'T','H':'U','I':'V','J':'W','K':'X','L':'Y','M':'Z','N':'A','O':'B','P':'C','Q':'D','R':'E','S':'F','T':'G','U':'H','V':'I','W':'J','X':'K','Y':'L','Z':'M'}5.3.2字典元素的访问1.通过“键”访问“值”方法1:字典名[键]方法2:字典名.get(键,默认值)#使用字典的get()方法>>>dictGDP1["湖北"]#"湖北"省GDP40237>>>dictGDP2["湖北"][0]#"湖北"省前三季度GDP同比增速(%)6.0>>>dictGDP3["湖北"]["武汉"] #"湖北"省"武汉"市的GDP141635.3.2字典元素的访问1.通过“键”访问“值”>>>dictGDP1["广西"] #"键"不存在,报错Traceback(mostrecentcalllast):File"<pyshell#61>",line1,in<module>dictGDP1["广西"]KeyError:'广西'>>>dictGDP1.get("湖北") #"湖北"省GDP40237>>>dictGDP1.get("广西") #字典中无"广西"省数据,不返回任何值>>>dictGDP1.get("广西","暂无数据")#字典中无"广西"省数据,返回"暂无数据"'暂无数据'5.3.2字典元素的访问2.字典的遍历字典的keys()、values()和items()方法可分别返回字典的所有“键”、所有“值”、和所有“键:值”对列表。结合这几种方法,使用for循环,可以实现对字典的“键”、“值”和“键:值”对的遍历。(1)遍历所有的“键”#遍历字典dictGDP1,输出其中所有的省份名称。>>> forkeyindictGDP1.keys(): print(key)湖北山东 四川5.3.2字典元素的访问2.字典的遍历(2)遍历所有的“值”

#遍历字典dictGDP1,输出所有省份的GDP数据。

#>>>forvalueindictGDP1.values(): print(value)4023768125433875.3.2字典元素的访问2.字典的遍历(3)遍历所有的键值对

#遍历字典dictGDP1,输出所有省份的名称及GDP数据。>>>foritemindictGDP1.items(): print(item)('湖北',40237)('山东',68125)('四川',43387)5.3.3字典元素的增删改1.添加或修改字典元素方法1:

d[key]=value#新增一个键值对,或者更新一个已有“键”的“值”方法2:

d.update(d1)#新增和更新字典d的多个键值对到d中方法3:

d.setdefault(key,[value]) #新增或更新一个键值对5.3.3字典元素的增删改1.添加或修改字典元素>>>dict1={}>>>dict1[“湖北”]=0 #新增“湖北”省的GDP数据为0>>>dict1 {'湖北':0}>>>dict1.update(dictGDP1)#更新“湖北”省的GDP数据,并新增“山东”和“四川”省的GDP数据>>>dict1{'湖北':40237,'山东':68125,'四川':43387}>>>dict1.update(dictGDP4)#新增三个沿海省份的GDP数据>>>dict1{'湖北':40237,'山东':68125,'四川':43387,'广东':96161,'浙江':59182,'海南':5274}5.3.3字典元素的增删改1.添加或修改字典元素>>>dict1.update(dictGDP3)#更新“湖北”“山东”“四川”省的GDP数据为详细的各城市数据>>>dict1{'湖北':{'武汉':14163,'襄阳':4225},'山东':{'青岛':11769,'济南':9229},'四川':{'成都':16114,'绵阳':2719},'广东':96161,'浙江':59182,'海南':5274}>>>dict1.setdefault(“云南”)#增加“云南”省的GDP数据,默认为None>>>dict1{'湖北':{'武汉':14163,'襄阳':4225},'山东':{'青岛':11769,'济南':9229},'四川':{'成都':16114,'绵阳':2719},'广东':96161,'浙江':59182,'海南':5274,'云南':None}5.3.3字典元素的增删改2.删除字典元素方法1:

d.pop(key)

#删除指定“键”的元素,返回该“键”的“值”方法2:

d.popitem()

#按后进先出顺序删除一个字典元素,并返回该键值对方法3:

d.clear()

#删除所有元素5.3.3字典元素的增删改2.删除字典元素>>>dict1=dict(dictGDP2)#根据前面创建的字典dictGDP2创建字典dict1>>>dict1{'湖北':(6.0,5.6),'山东':(6.0,6.2),'四川':(6.5,5.5)}>>>dict1.pop("四川") #删除并返回四川的GDP数据(6.5,5.5)>>>dict1{'湖北':(6.0,5.6),'山东':(6.0,6.2)}>>>dict1.popitem() #删除山东的GDP数据,以元组方式返回山东的“键”、“值”数据('山东',(6.0,6.2))>>>dict1{'湖北':(6.0,5.6)}>>>dict1.clear() #删除所有的键值数据>>>dict1{}5.3.3字典元素的增删改2.删除字典元素还可以用del命令删除字典元素或删除字典对象。>>>dict1={'湖北':40237,'山东':68125,'四川':43387}>>>deldict1["湖北"] #删除字典dict1中“湖北”的数据>>>dict1{'山东':68125,'四川':43387}>>>deldict1 #删除字典dict1>>>dict1 #字典dict1已被删除,报错Traceback(mostrecentcalllast):File"<pyshell#49>",line1,in<module>dict1NameError:name'dict1'isnotdefined5.3.4字典的常用操作1.字典元素的统计内置函数len()可以统计字典中键值对的个数,sum()、max()和min()函数仅针对字典的“键”进行计算,很多情况下实际意义不大。>>>dictGDP1={"湖北":40237,"山东":68125,"四川":43387}>>>len(dictGDP1)3>>>max(dictGDP1)'湖北'5.3.4字典的常用操作2.字典元素的成员检测使用in/notin操作可以判断字典中是否含有特定的“键”。>>>"湖北"indictGDP1True5.3.4字典的常用操作3.字典的排序内置函数sorted()可以将字典的“键”按照字母顺序排列成有序的列表。利用这个有序列表,可以间接实现按序访问字典的键值对。>>>dictGDP5={"SiChuan":43387,"HuBei":40237,"ShanDong":68125}>>>sorted(dictGDP5)#返回一个按“键”排列的列表['HuBei','ShanDong','SiChuan']>>>forkeyinsorted(dictGDP5):#按“键”的字母序输出“键”和“值”

print(key,dictGDP5[key])HuBei40237ShanDong68125SiChuan433875.3.4字典的常用操作4.字典的复制字典的copy()方法和dict()方法均可实现字典对象的复制>>>dictGDP1={"湖北":40237,"山东":68125,"四川":43387}>>>dict1=dict(dictGDP1)>>>dict2=dictGDP1.copy()>>>dict1["湖北"]=None>>>dict2["四川"]=None>>>dict1{'湖北':None,'山东':68125,'四川':43387}>>>dict2{'湖北':40237,'山东':68125,'四川':None}>>>dictGDP1{'湖北':40237,'山东':68125,'四川':43387}5.3.4字典的常用操作4.字典的复制可以使用关系运算符“==”或“!=”判断两个字典的内容是否相等。>>>dict1!=dict2 #dict1和dict2不相等True>>>dict3=dict1>>>dict3==dict1True5.3.4字典的常用操作4.字典的复制赋值操作dict3=dict1并没有实现复制,而只是使得dict3和dict1引用同一个字典对象,对其中任何一个的修改,都会反映到另一个中>>>dict3['湖南']=36953 #dict3中增加一个元素,“湖南”的GDP数据>>>dict3{'湖北':None,'山东':68125,'四川':43387,'湖南':36953}>>>dict1{'湖北':None,'山东':68125,'四川':43387,'湖南':36953}目录1组合数据类型——元组组合数据类型——列表2

组合数据类型——字典3组合数据类型——集合4组合数据类型应用案例55.4

集合集合类型类似数学中集合的概念,用于存储一组不可重复、无序的数据集。集合元素可以是整数、浮点数、字符串、元组等不可变类型,不能是列表、字典和集合等可变类型。5.4.1集合的创建1.使用{}创建>>>setA={1,2,3,True,"Title",(4,5)}>>>setB={[1,2,3],[4,5,6]}#报错,因为列表是可变类型,不可以做集合元素Traceback(mostrecentcalllast):File"<pyshell#54>",line1,in<module>setB={[1,2,3],[4,5,6]}TypeError:unhashabletype:'list'>>>setC={}#直接使用“{}”创建的是空字典,不是空集合>>>type(setC)<class'dict'>5.4.1集合的创建2.使用set()函数创建>>>emptyS=set()#创建空集合>>>setD=set("Excellent")#使用字符串对象创建集合,重复的元素将自动被去除>>>setD{'e','E','c','t','n','l','x'}>>>setE=set({"City":"WuHan","Population":8591611,"Area":8569.15})#使用字典的“键”创建集合>>>setE{'Area','City','Population'}5.4.1集合的创建3.使用集合推导式创建>>>setF={i**2foriinrange(-5,6)}>>>setF{0,1,4,9,16,25}5.4.2集合元素的遍历由于集合是无序的序列类型,所以无法通过元素的位置或切片方式访问指定的单个或多个元素,但是依然可以使用for循环实现集合元素的遍历。>>>foriteminsetF: print(item,end="")014916255.4.3集合元素的增删1.添加集合元素使用集合的add()方法可以向集合中添加一个元素,使用update()方法可以向集合中添加多个元素。>>>set1={"apple","banana"}>>>set1.add("orange") #向set1中添加"orange">>>set1{'orange','apple','banana'}>>>set1.update({"pear","purple"})#向set1中添加"pear"和"purple">>>set1{'orange','banana','purple','apple','pear'}5.4.3集合元素的增删2.删除集合元素使用集合的discard()、remove()或pop()方法可删除集合的一个元素。使用集合的clear()方法可删除集合中的所有元素。>>>set1={'orange','banana','purple','apple','pear'}>>>set1.discard("apple") #指定删除"apple">>>set1.pop() #随机删除一个元素'orange'>>>set1.remove("purple") #指定删除"purple">>>set1.clear() #删除所有元素5.4.4集合的数学运算1.基本的集合运算

Python的集合类型类似于数学中集合的概念,使用运算符&、|、-、^可以实现数学中集合求交、求并、求差、求补的基本集合运算。>>>set1={iforiinrange(1,21)ifi%3==0}#1~20范围内3的倍数的数的集合>>>set2={iforiinrange(1,21)ifi%2==0}#1~20范围内2的倍数的数的集合>>>set1{3,6,9,12,15,18}>>>set2{2,4,6,8,10,12,14,16,18,20}5.4.4集合的数学运算1.基本的集合运算

Python的集合类型类似于数学中集合的概念,使用运算符&、|、-、^可以实现数学中集合求交、求并、求差、求补的基本集合运算。>>>set1-set2 #1~20范围内是3的倍数,但不是2的倍数的数的集合{9,3,15}>>>set1&set2 #1~20范围内同是2和3的倍数的数的集合{18,12,6}>>>set1|set2 #1~20范围内是2或3的倍数的数的集合{2,3,4,6,8,9,10,12,14,15,16,18,20}>>>set1^set2 #1~20范围内要么是2的倍数,要么是3的倍数的数的集合{2,3,4,8,9,10,14,15,16,20}5.4.4集合的数学运算1.基本的集合运算以上set1和set2的集合运算不会改变set1和set2集合的原始内容。下面的集合运算将改变set1中的内容。>>>s=set1&set2 >>>s {18,12,6}>>>set1|=set2 #合并set1和set2的元素到set1中,去除重复的元素>>>set1 {2,3,4,6,8,9,10,12,14,15,16,18,20}>>>set1-=s >>>set1{2,3,4,8,9,10,14,15,16,20}5.4.4集合的数学运算2.集合关系的判断集合之间有相交、不相交、包含等关系。使用集合的isdisjoint()方法可以判断两个集合是否相交,使用关系运算符“<”、“<=”、“>”、“>=”可以判断两个集合之间的包含关系,使用“==”可判断两个集合是否相等。5.4.4集合的数学运算2.集合关系的判断>>>set1={2,3,4,8,9,10,14,15,16,20}>>>set2={2,4,6,8,10,12,14,16,18,20}>>>9inset2#False>>>set1.isdisjoint(set2)#False,set1和set2有交集>>>set1&set2==set()#False,set1和set2的交集不为空,set1和set2有交集>>>set1>{2,4,8,16} #True,{2,4,6,8}是set1的真子集目录1组合数据类型——元组组合数据类型——列表2

组合数据类型——字典3组合数据类型——集合4组合数据类型应用案例55.5组合数据类型应用案例1【例5-1】键盘输入所有学生的年龄,之间以“,”分隔,计算并输出所有学生的平均年龄以及最大年龄和最小年龄。分析:对于以英文逗号分隔的方式从键盘输入的多个学生的年龄数据,首先需要从输入的字符串中提取出每个年龄数据放到一个列表中,然后使用内置函数sum()对列表中的数据求和得到年龄的总和,使用内置函数len()计算列表元素的个数即人数,然后两者相除得到年龄的平均值。使用内置函数max()和min()可以统计列表中的最大年龄和最小年龄。5.5组合数据类型应用案例1【例5-1】键盘输入所有学生的年龄,之间以“,”分隔,计算并输出所有学生的平均年龄以及最大年龄和最小年龄。inAges=input("请输入所有学生的年龄:(以逗号分隔):")studAllAge=inAges.split(",")studAllAge=list(map(int,studAllAge))avgAge=sum(studAllAge)/len(studAllAge)print("平均年龄{0:.1f}".format(avgAge))#平均年龄18.7print("最大年龄{},最小年龄{}".format(max(studAllAge),min(studAllAge)))参考代码:5.5组合数据类型应用案例2【例5-2】从键盘输入n个字符串,要求找出长度最长的字符串并输出。

分析:要从多个字符串中查找长度最长的字符串,首先需要计算最长串的长度,然后根据这个长度值,查找对应长度的字符串,即为问题的解。注意:长度最长的字符串可能不止一个,有可能多个串并列为最长串。5.5组合数据类型应用案例2【例5-2】从键盘输入n个字符串,要求找出长度最长的字符串并输出。

n=int(input("请输入需要输入的字符串的个数n:"))#输入n个字符串存放到列表lstString中lstString=[]foriinrange(n):s=input("请输入一个字符串:")lstString.append(s)参考代码:1~6行5.5组合数据类型应用案例2【例5-2】从键盘输入n个字符串,要求找出长度最长的字符串并输出。

#遍历列表lstString的元素,求最长串的串长值maxLenlstLen=[]foriinrange(n):lstLen.append(len(lstString[i]))maxLen=max(lstLen)print("最长串的长度值是:",maxLen)参考代码:8~13行5.5组合数据类型应用案例2【例5-2】从键盘输入n个字符串,要求找出长度最长的字符串并输出。

#遍历列表lstLen的元素print("长度最长的串是:")foriinrange(n):iflstLen[i]==maxLen:print("\t",lstString[i])参考代码:15~19行5.5组合数据类型应用案例3【例5-3】判断一组随机数据的分布形态。

5.5组合数据类型应用案例3【例5-3】判断一组随机数据的分布形态。

分析:(1)首先随机生成一组数据,存放在列表对象中,然后分别计算它们的平均数和中位数。(2)平均数的计算。将所有数据求和,然后除以数据的个数。(3)中位数的计算。首先,把所有的数据按照大小的顺序排列,然后根据数据个数的奇偶性,分别进行计算。如果数据的个数是奇数,则中间那个数据就是这组数据的中位数;如果数据的个数是偶数,则中间那2个数据的算术平均值就是这组数据的中位数。(4)比较平均数和中位数的大小,确定数据的形态特征。若平均数>中位数,则该组数据呈正偏态分布;若平均数=中位数,则该组数据呈正态分布;若平均数<中位数,则该组数据呈负偏态分布。5.5组合数据类型应用案例3【例5-3】判断一组随机数据的分布形态。

importrandomnums=[random.randint(0,10000)foriinrange(random.randint(8,12))]n=len(nums)#n为该组数据的个数print("随机生成了{}个数据\n具体是:".format(n),end="")foriteminnums:print(item,end="")print()参考代码:1~7行5.5组合数据类型应用案例3【例5-3】判断一组随机数据的分布形态。

#计算中位数nums.sort()#对该组数据进行排序,默认是升序ifn%2==0:#数据的个数为偶数

Median=(nums[n//2-1]+nums[n//2])/2else:#数据的个数为奇数

Median=nums[n//2]#计算平均数mean=sum(nums)/nprint("这组数据的中位数是{0},平均数是{1:.2f}".format(Median,mean))参考代码:9~19行5.5组合数据类型应用案例3【例5-3】判断一组随机数据的分布形态。

#根据中位数与平均数的关系,给出数据的分布形态ifmean>Median:print("该组数据呈正偏态分布")elifMedian==mean:print("该组数据呈正态分布")else:print("该组数据呈负偏态分布")参考代码:21~27行5.5组合数据类型应用案例4【例5-4】某公司在全国分布有四个仓库,用于商品1、商品2和商品3的进货存储。各仓库当前库存的商品具体数量如表5-1所示。已知每件商品的成本和单件商品所需的仓库存储空间的体积如表5-2所示。请统计每个仓库库存商品的总成本以及总的占用空间情况。5.5组合数据类型应用案例4【例5-4】请统计每个仓库库存商品的总成本以及总的占用空间情况。

分析:根据题目提供的数据特点,可以使用两个矩阵提供仓库的各种商品的库存数量、单件商品的成本及所需存储空间数据。两个矩阵相乘得到的结果矩阵的第一列数据即为各个仓库所存放的商品的总成本,第二列数据即为各个仓库中的商品所需的总存储空间。可以使用嵌套列表来表示矩阵结构,最后的结果矩阵也采用嵌套列表表示。5.5组合数据类型应用案例4【例5-4】请统计每个仓库库存商品的总成本以及总的占用空间情况。warehouse=["仓库A","仓库B","仓库C","仓库D"]goodsQuantity=[[10,20,10],[20,16,12],[15,18,7],[6,21,9]]Cost_Volume=[[2500,1],[1200,12],[900,0.8]]参考代码:1~3行#

使用两个嵌套列表goodsQuantity和Cost_Volume给出仓库当前库存商品数量和单件商品的成本以及所需存储空间数据,使用warehouse列表存放仓库的名称。5.5组合数据类型应用案例4【例5-4】请统计每个仓库库存商品的总成本以及总的占用空间情况。row_A=len(goodsQuantity)col_A=len(goodsQuantity[0])col_B=len(Cost_Volume[0])#创建一个矩阵result用于存放矩阵goodsQuantity乘以矩阵Cost_Volume的结果,各元素初始值为0result=[[0foriinrange(col_B)]forjinrange(row_A)]参考代码:5~10行#使用嵌套列表result记录计算的结果5.5组合数据类型应用案例4【例5-4】请统计每个仓库库存商品的总成本以及总的占用空间情况。#按行遍历矩阵goodsQuantityforiinrange(row_A):#按列遍历矩阵Cost_Volumeforjinrange(col_B):#根据矩阵乘法的规则,计算矩阵result的各个元素的值forkinrange(col_A):

result[i][j]+=goodsQuantity[i][k]*Cost_Volume[k][j]

参考代码:12~18行5.5组合数据类型应用案例4【例5-4】请统计每个仓库库存商品的总成本以及总的占用空间情况。#输出矩阵result的结果数据print("仓库\t库存商品总成本\t库存商品存储空间")print("-"*40)foriinrange(row_A):print(warehouse[i],end="\t")forjinrange(col_B):print(result[i][j],end="\t\t")print()参考代码:20~27行5.5组合数据类型应用案例5【例5-5】GDPTable字典中存放了如表5-3所示的2022年全国部分超大城市的GDP数据,其中:城市名称为“键”,GDP数据为“值”。请按GDP数据从大到小输出这几个城市的排名结果(假设各个城市的GDP的值都不相同)。5.5组合数据类型应用案例5【例5-5】请按GDP数据从大到小输出这几个城市的排名结果(假设各个城市的GDP的值都不相同)。

分析:要按GDP的大小排序输出城市的排名,首先需要对GDP数据进行排序,然后按GDP的顺序输出相应的城市。内置函数sorted()只能对字典的“键”排序,如果能把字典中的“键”、“值”关系对调一下,就可以利用内置函数sorted()对GDP数据排序,然后就能对应输出排序后的城市信息了。5.5组合数据类型应用案例5【例5-5】请按GDP数据从大到小输出这几个城市的排名结果(假设各个城市的GDP的值都不相同)。GDPTable={"北京":41610.9,"上海":44652.8,"广州":28839,"深圳":32387.68,"成都":20817.5,"重庆":29129.03,"天津":14083}

Table1={value:keyforkey,valueinGDPTable.items()}GDPList=sorted(Table1,reverse=True)print("{}大城市GDP排名情况如下:".format(len(GDPTable)))rank=1forgdpinGDPList:print("{}:{}\t{}".format(rank,Table1[gdp],gdp))rank=rank+1参考代码:5.5组合数据类型应用案例6【例5-6】表5-4和表5-5分别存放某了某用户投资的理财产品持仓信息和所有理财产品的当前市值数据。用户可以购买新的理财产品,也可以追加购买已有的理财产品,或者对理财产品进行部分或全部赎回。购买或赎回产品后,应更新用户的理财产品持仓信息。用户可根据自己当前理财产品投资的持仓情况以及理财产品的当前市值统计当前持仓理财产品的总市值。请对该用户的理财产品投资管理进行模拟。5.5组合数据类型应用案例6【例5-6】请对该用户的理财产品投资管理进行模拟。5.5组合数据类型应用案例6【例5-6】请对该用户的理财产品投资管理进行模拟。

分析:根据题目提供的数据的特点,可以使用两个字典investInfo和marketValue分别存储理财产品持仓信息和所有理财产品的当前市值信息。若用户购买了新的理财产品,则增加该购买信息到investInfo字典中,若用户新增某理财产品的额度,则增加该理财产品的持仓额度。若用户部分赎回理财产品。则减少该理财产品的持仓额度;若全部赎回理财产品,则删除该理财产品的持仓信息。根据字典marketValue字典中所存放的产品当前市值,可以计算出该用户所有理财产品的总市值。5.5组合数据类型应用案例6【例5-6】请对该用户的理财产品投资管理进行模拟。investInfo={"GD030201":100,"ZX030110":200,"8972E":300}marketValue={"NY030102":1.0,"JX030102":1.2,"ZX0030109":1.05,"PY030111":0.92,"GD030201":1.23,"ZX030110":1.3,"8972E":1.28}参考代码:1~2行#定义investInfo字典用于存放某用户投资的理财产品持仓信息(产品编号、持仓额度);marketValue字典用于存放所有理财产品的当前市值信息。5.5组合数据类型应用案例6【例5-6】请对该用户的理财产品投资管理进行模拟。menu1='''请选择操作类型:====================1.买入2.赎回3.查看持仓产品总市值4.退出''‘menu2=list(marketV

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论