版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第5章字典与集合董付国微信公众号:Python小屋本章学习目标理解字典与集合的概念熟练掌握创建字典与集合的不同形式理解字典“键”与集合元素的相似之处熟练掌握字典对象与集合对象的常用方法理解并熟练掌握字典对象使用下标赋值的含义与功能熟练掌握字典方法get()的应用熟练掌握字典与集合对运算符和内置函数的支持5.1字典字典是Python内置容器类,是重要的可迭代对象之一,用来表示一种对应关系或映射关系。字典中可以包含任意多个元素,每个元素包含“键”和“值”两部分,两部分之间使用冒号分隔,不同元素之间用逗号分隔,所有元素放在一对大括号中。字典中元素的“键”可以是任意可哈希(或不可变)类型的数据,例如整数、实数、复数、字符串、元组等类型,不能使用列表、集合、字典或其他可变类型的对象作为字典的“键”,包含列表等可变数据的元组也不能作为字典的“键”。字典是可变的,可以动态地增加、删除元素,也可以随时修改元素的“值”。在任何时刻,字典中的“键”都不重复,“值”可以重复。5.1.1创建字典的几种形式#创建空字典>>>data={}>>>data=dict()#直接使用大括号创建字典>>>colors={'red':(255,0,0),'green':(0,255,0),'blue':(0,0,255)}#Python3.6之后的版本中,元素加入的顺序与显示的顺序一致>>>print(colors){'red':(255,0,0),'green':(0,255,0),'blue':(0,0,255)}#列表属于不可哈希对象,不能作为字典的“键”,会抛出异常>>>data={[1,2,3]:'red'}TypeError:unhashabletype:'list'#字典属于不可哈希类型>>>hash({})TypeError:unhashabletype:'dict'#把包含若干(key,value)形式元素的有限长度可迭代对象转换为字典>>>data=dict(zip('abcd','1234'))>>>print(data){'a':'1','b':'2','c':'3','d':'4'}5.1.1创建字典的几种形式>>>data=dict([('a',97),('b',98),('c',99)])>>>print(data){'a':97,'b':98,'c':99}>>>data=dict(enumerate('Python'))>>>print(data){0:'P',1:'y',2:'t',3:'h',4:'o',5:'n'}#以参数的形式指定“键”和“值”>>>data=dict(language='Python',version='3.10.6')>>>print(data){'language':'Python','version':'3.10.6'}#以可迭代对象中的元素为“键”,创建“值”为空的字典>>>data=dict.fromkeys('abcd')>>>print(data){'a':None,'b':None,'c':None,'d':None}#以可迭代对象中的元素为“键”,创建字典,所有元素的“值”相等>>>data=dict.fromkeys('abcd',666)>>>print(data){'a':666,'b':666,'c':666,'d':666}5.1.1创建字典的几种形式>>>data=dict.fromkeys('abcd',777)#如果所有元素的“值”是同一个对象的引用,会互相影响>>>data=dict.fromkeys('abc',[])>>>print(data){'a':[],'b':[],'c':[]}>>>data['a'].append(3)>>>print(data){'a':[3],'b':[3],'c':[3]}#使用字典推导式创建字典>>>data={num:chr(num)fornuminrange(97,100)}>>>print(data){97:'a',98:'b',99:'c'}#下面这两种形式属于函数式编程模式,运行速度比上面的字典推导式略快>>>data=dict(map(lambdanum:(num,chr(num)),range(97,100)))>>>print(data){97:'a',98:'b',99:'c'}5.1.1创建字典的几种形式>>>data=dict(zip(range(97,100),map(chr,range(97,100))))>>>print(data){97:'a',98:'b',99:'c'}#字符串对象的maketrans()方法返回表示映射关系的字典>>>table=str.maketrans('abcd','1234')#字典中的“键”和“值”是字符的Unicode编码>>>print(table){97:49,98:50,99:51,100:52}#标准库collections中的函数Counter用来统计有限长度可迭代对象中元素出现次数#返回类似于字典的Counter对象>>>fromcollectionsimportCounter>>>data=Counter([1,1,2,2,3,1,2,1])#每个元素作为“键”,出现次数作为“值”>>>print(data)Counter({1:4,2:3,3:1})5.1.2字典常用方法(1)字典元素访问字典支持下标运算,把“键”作为下标即可返回对应的“值”,如果字典中不存在这个“键”会抛出KeyError异常提示不存在指定的“键”。使用下标访问元素“值”时,一般建议配合选择结构或者异常处理结构,以免代码异常引发崩溃。5.1.2字典常用方法data={'age':43,'name':'Dong','sex':'male'}key=eval(input('请输入一个键:'))#与选择结构结合,先确定“键”在字典中再使用下标访问ifkeyindata:print(data[key])else:print('字典中没有这个键')key=eval(input('再输入一个键:'))#与异常处理结构结合,如果“键”不在字典中再进行相应的处理try:print(data[key])except:print('字典中没有这个键')运行结果为:请输入一个键:'age'39再输入一个键:123字典中没有这个键5.1.2字典常用方法为了避免“键”不存在时代码崩溃抛出异常,一般推荐使用字典的get(key,default=None,/)方法获取指定“键”对应的“值”,参数key指定的“键”不存在时返回空值或参数default指定的值,代码鲁棒性更好一些,至少get()方法调用不会出错抛出异常。但这并不意味着使用了get()方法就万事大吉了,仍需要对该方法的返回值进行必要的检查,以免后面的代码引发异常。5.1.2字典常用方法data={'age':43,'name':'Dong','sex':'male'}print(data.get('age'))#指定的“键”存在,返回对应的“值”print(data.get('address'))#指定的“键”不存在,默认返回空值print(data.get('address','不存在'))#指定的“键”不存在,返回指定的值#使用lambda表达式作为字典的“值”functions={'f1':lambda:3,'f2':lambda:5,'f3':lambda:8}key=input('请输入:')func=functions.get(key)#这个检查非常有必要,如果输入的内容不是字典的“键”,返回的空值不是可调用对象#语句func()会抛出异常TypeError:'NoneType'objectisnotcallableiffunc:print(func())else:print('error')运行结果为:43None不存在请输入:f135.1.2字典常用方法字典属于Python内置可迭代对象类型之一,可以将其转换为列表或元组,也可以使用for循环直接进行遍历。在这样的场合中,默认情况下是遍历字典的“键”,如果需要遍历字典的元素必须使用字典对象的items()方法明确说明,如果需要遍历字典的“值”则必须使用字典对象的values()方法明确说明。当使用len()、max()、min()、sum()、sorted()、enumerate()、map()、filter()等内置函数以及成员测试运算符in对字典对象进行操作时,也遵循同样的约定。5.1.2字典常用方法>>>data={'host':'','port':80,'protocol':'TCP'}>>>print(data){'host':'','port':80,'protocol':'TCP'}>>>print(len(data))#查看字典长度,也就是其中元素的个数3>>>print('port'indata)#查看字典中是否存在以'port'为“键”的元素True>>>print(80indata.values())#查看字典中是否存在以80为“值”的元素True>>>print(list(data))#把字典中所有元素的“键”转换为列表['host','port','protocol']>>>print(list(data.keys()))#与上一行代码等价['host','port','protocol']>>>print(list(data.values()))#把字典所有元素的“值”转换为列表['',80,'TCP']>>>print(list(data.items()))#把字典所有的元素转换为列表[('host',''),('port',80),('protocol','TCP')]5.1.2字典常用方法#使用for循环遍历字典的“键”,直接使用data和使用data.keys()是等价的>>>forkeyindata:print(key)
hostportProtocol#在字典前面加一个星号表示对“键”进行解包>>>print(*data,sep=',')host,port,protocol#在字典前面加两个星号表示把元素解包为关键参数或“键:值”对>>>print({**data,'test':666}){'host':'','port':80,'protocol':'TCP','test':666}#使用for循环遍历字典的“值”,必须使用values()方法明确说明>>>forvalueindata.values():print(value)
80TCP5.1.2字典常用方法#使用for循环遍历字典的元素,必须使用items()方法明确说明>>>foritemindata.items():print(item)
('host','')('port',80)('protocol','TCP')#items()方法返回结果的每个元素是一个(key,value)形式的元组#请自行查看data.keys()和data.values()的返回结果>>>print(data.items())dict_items([('host',''),('port',80),('protocol','TCP')])#使用两个循环变量同时遍历字典元素的“键”和“值”#下面的代码适用于Python3.8之后的版本,低版本可以把f-字符串中的等号删除>>>forkey,valueindata.items():print(f'{key=},{value=}')
key='host',value=''key='port',value=80key='protocol',value='TCP'5.1.2字典常用方法(2)字典元素添加与修改当以指定“键”为下标为字典元素赋值时,有两种含义:1)若该“键”存在,表示修改该“键”对应元素的“值”;2)若该“键”不存在,表示添加一个新元素。>>>data={'host':'','port':80}>>>data['host']=''#修改已有元素的“值”,不改变元素顺序>>>print(data){'host':'','port':80}>>>data['protocol']='TCP'#在尾部添加新元素>>>print(data){'host':'','port':80,'protocol':'TCP'}5.1.2字典常用方法(3)字典元素删除字典对象的pop(k[,d])可以用来删除参数k指定的“键”对应的元素,同时返回对应的“值”,如果字典中没有k指定的“键”并且指定了参数d就返回d的值,如果没有k指定的“键”并且也没有指定参数d就抛出KeyError异常。字典方法popitem()方法用于按LIFO(后进先出)的顺序删除并返回一个2-元组(key,value),其中的两个元素分别是字典元素的“键”和“值”。字典方法clear()用于清空字典中所有元素。另外,也可以使用del删除指定的“键”对应的元素。5.1.2字典常用方法>>>data={'host':'','port':8080,'scheme':'HTTP'}#指定的“键”不存在,并且没有指定参数d,抛出异常>>>print(data.pop('protocol'))KeyError:'protocol'#指定的“键”不存在,但是指定了参数d,就返回参数d的值>>>print(data.pop('protocol','不存在'))不存在#指定的“键”存在,直接返回对应的元素的“值”,忽略参数d的内容>>>print(data.pop('scheme','不存在'))HTTP>>>print(data){'host':'','port':8080}#删除并返回字典中最后一个元素>>>print(data.popitem())('port',8080)#删除指定的“键”对应的元素,没有返回值>>>deldata['host']>>>print(data){}5.1.2字典常用方法>>>data={'host':'','port':8080,'scheme':'HTTP'}#原地删除字典里的所有元素>>>data.clear()>>>print(data){}>>>data={'host':'','port':8080,'scheme':'HTTP'}#按后入先出顺序依次删除并返回字典中的元素>>>for_inrange(3):print(data.popitem())
('scheme','HTTP')('port',8080)('host','')>>>print(data){}5.2集合集合也是Python常用的内置可迭代类型之一。集合中所有元素放在一对大括号中,元素之间使用英文半角逗号分隔。同一个集合内的每个元素都是唯一的。类似于字典的“键”,集合中的元素只能是整数、实数、复数、字符串、字节串、元组等不可变或可哈希的数据,不能包含列表、字典、集合等可变类型或不可哈希的数据,包含列表或其他可变类型数据的元组也不能作为集合的元素。如果试图把不可哈希数据作为集合的元素,会抛出TypeError异常并提示“unhashabletype”。集合是可变的,创建之后可以添加和删除元素。集合中的元素是无序的,元素存储顺序和添加顺序并不一致,先放入集合的元素不一定存储在前面。集合中的元素不存在“位置”或“索引”的概念,不支持下标和切片。5.2.1创建集合#直接使用大括号创建集合>>>data={'red','green','blue'}#注意,集合中的元素存储顺序和放入的先后顺序不一定相同>>>print(data){'blue','red','green'}#注意,{}表示空字典,不能用来创建空集合,应使用set()创建空集合>>>data=set()#把range对象转换为集合>>>data=set(range(5))#把列表转换为集合,自动去除重复的元素>>>data=set([1,2,3,4,3,5,3])>>>print(data){1,2,3,4,5}5.2.1创建集合#把字符串转换为集合,注意,不要在意集合中元素的顺序#并且在不同的IDLE会话中元素的顺序有可能不一样>>>data=set('Python')>>>print(data){'h','t','y','n','P','o'}#把map对象转换为集合>>>data=set(map(chr,[97,97,98,99,98,100]))>>>print(data){'a','d','b','c'}#把filter对象转换为集合>>>data=set(filter(None,(3,3,0,False,5,7,True,'a')))>>>print(data){True,3,5,7,'a'}#把zip对象转换为集合>>>data=set(zip('Python',range(3)))>>>print(data){('y',1),('P',0),('t',2)}5.2.2集合常用方法(1)原地增加与删除集合元素集合方法add()、update()可以用于向集合中添加新元素,difference_update()、intersection_update()、pop()、remove()、symmetric_difference_update()、clear()可以用于删除集合中的元素,这些方法都是对集合对象原地进行修改,没有返回值。5.2.2集合常用方法>>>data={97,98,99,666}>>>print(data){97,98,99,666}#当前集合中没有元素100,成功加入>>>data.add(100)>>>print(data){97,98,99,100,666}#当前集合中已经存在元素100,该操作被自动忽略,并且不会提示>>>data.add(100)>>>print(data){97,98,99,100,666}#把任意多个可迭代对象中的元素都合并到当前集合中,自动忽略已存在的元素>>>data.update([97,101],(98,102),{99,103})>>>print(data){97,98,99,100,101,102,103,666}#从当前集合中删除所有参数可迭代对象中的元素>>>data.difference_update([99],(100,105),{97})>>>print(data){98,101,102,103,666}5.2.2集合常用方法#计算当前集合与所有参数可迭代对象的交集,更新当前集合>>>ersection_update(range(97,105),(103,105),{98,103,666})>>>print(data){103}#从集合中删除并返回任意一个元素>>>print(data.pop())103#试图对空集合调用pop()方法会抛出异常>>>print(data.pop())KeyError:'popfromanemptyset'#对空集合调用clear()删除所有元素,不会抛出异常>>>data.clear()#空集合使用set()创建和表示,而不是{}>>>print(data)set()5.2.2集合常用方法>>>data={1,2,3}#集合中没有5,但代码不会出错>>>data.discard(5)>>>data{1,2,3}#集合中有3,删除该元素>>>data.discard(3)>>>data{1,2}5.2.2集合常用方法(2)计算交集/并集/差集/对称差集返回新集合集合方法difference()、intersection()、union()分别用来返回当前集合与另外一个或多个集合(或有限长度的其他类型可迭代对象)的差集、交集、并集,symmetric_difference()用来返回当前集合与另外一个集合或有限长度的其他类型可迭代对象的对称差集,这些方法的参数不必须是集合,可以是有限长度的任意可迭代对象。5.2.2集合常用方法>>>data={1,2,3,4,5}#差集>>>print(data.difference({1},(2,),map(int,'34'))){5}#交集>>>print(ersection({1,2,3},[3],(5,)))set()#并集>>>print(data.union({0,1},(2,3),[4,5,6],range(5,9))){0,1,2,3,4,5,6,7,8}#对称差集,参数不必须是集合,可以是有限长度的任意可迭代对象>>>print(data.symmetric_difference({3,4,5,6,7})){1,2,6,7}>>>print(data.symmetric_difference(range(3,8))){1,2,6,7}>>>print(data.symmetric_difference([3,4,5,6,7])){1,2,6,7}5.2.2集合常用方法(3)集合包含关系测试集合方法issubset()、issuperset()、isdisjoint()分别用来测试当前集合是否为另一个集合的子集、是否为另一个集合的超集、是否与另一个集合不相邻(或交集是否为空),这几个方法的参数可以任意类型的可迭代对象。5.2.2集合常用方法>>>print({1,2,3}.issubset({1,2,3,4,5}))True>>>print({1,2,3}.issubset(range(5)))True>>>print({1,2,3}.issubset(list(range(5))))True>>>print({1,2,3}.issubset(tuple(range(5))))True>>>print({1,2,3}.issubset(map(int,'1234')))True>>>print({1,2,3,4,5}.issubset(filter(None,range(6))))True>>>print({1,2,3,4,5}.issubset(filter(None,range(5))))False5.3综合例题解析例5-1编写程序,输入任意字符串,统计并输出每个唯一字符及其出现次数,要求按每个唯一字符的出现顺序输出。text=input('请输入任意内容:')fre=dict()forchintext:fre[ch]=fre.get(ch,0)+1forch,numberinfre.items():print(ch,number,sep=':')运行结果为:请输入任意内容:gabcddcbaeg:1a:2b:2c:2d:2e:15.3综合例题解析例5-2检查一个集合是否为和谐集,也就是从中删除任意一个元素之后,剩余元素可以分成两个集合,并且两个集合中的元素相加之和相等。5.3综合例题解析fromitertoolsimportcombinationsdefcheck(data):#保存所有可能的拆分结果result={}#依次取出每个数,检查剩余元素是否能恰好等分fornumindata:#t是从data中取出num后的剩余元素组成的集合t=data-{num}s=sum(t)#如果剩余元素之和为奇数,肯定不是和谐集,不需要再判断ifs%2==1:breakhalf=s//2#检查剩余元素是否存在和为half的组合foriinrange(1,len(t)//2+1):foritemincombinations(t,i):ifsum(item)==half:#记录当前组合tt=result.get(num,[])tt.append((set(item),t-set(item)))result[num]=ttbreakelse:continuebreak#如果result和data长度相等,说明每个元素取出后剩余元素都能等分iflen(result)==len(data):returnresult5.3综合例题解析#需要检查是否为和谐集的数据data=({1,3,5,7,9,11,13},{2,4,6,8,10,12,14},{1,1,1,1,1,1,1})fordindata:print('='*10,d)result=check(d)ifresult:print('拆分结果:')fork,vinresult.items():print(k,v,sep=':')else:print('不是和谐集')运行结果为:=========={1,3,5,7,9,11,13}
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年度电梯安装工程安全监理与质量监督合同4篇
- 2025年度新能源汽车抵押贷款转让服务合同范本4篇
- 2025年度餐饮厨房设备更新改造合同2篇
- 2025版个人短期教育培训借款合同范本2篇
- 2025年度个人贷款合同资产保全与处置规定4篇
- 2025年度代理开票业务风险管理合作协议4篇
- 二零二四年度猪肉产品溯源体系建设合同3篇
- 二零二五年度房地产投资融资顾问服务协议
- 2025年中国光电式感烟探测器市场调查研究报告
- 尿急神经损伤康复效果分析-深度研究
- 2019版新人教版高中英语必修+选择性必修共7册词汇表汇总(带音标)
- 新译林版高中英语必修二全册短语汇总
- 基于自适应神经网络模糊推理系统的游客规模预测研究
- 河道保洁服务投标方案(完整技术标)
- 品管圈(QCC)案例-缩短接台手术送手术时间
- 精神科病程记录
- 阅读理解特训卷-英语四年级上册译林版三起含答案
- 清华大学考博英语历年真题详解
- 人教版三年级上册口算题(全册完整20份 )
- 屋面及防水工程施工(第二版)PPT完整全套教学课件
- 2023年高一物理期末考试卷(人教版)
评论
0/150
提交评论