第5章 字典與集合_第1頁
第5章 字典與集合_第2頁
第5章 字典與集合_第3頁
第5章 字典與集合_第4頁
第5章 字典與集合_第5頁
已閱讀5頁,還剩32頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

第5章字典與集合董付國微信公眾號:Python小屋本章學習目標理解字典與集合的概念熟練掌握創(chuàng)建字典與集合的不同形式理解字典“鍵”與集合元素的相似之處熟練掌握字典對象與集合對象的常用方法理解并熟練掌握字典對象使用下標賦值的含義與功能熟練掌握字典方法get()的應(yīng)用熟練掌握字典與集合對運算符和內(nèi)置函數(shù)的支持5.1字典字典是Python內(nèi)置容器類,是重要的可迭代對象之一,用來表示一種對應(yīng)關(guān)系或映射關(guān)系。字典中可以包含任意多個元素,每個元素包含“鍵”和“值”兩部分,兩部分之間使用冒號分隔,不同元素之間用逗號分隔,所有元素放在一對大括號中。字典中元素的“鍵”可以是任意可哈希(或不可變)類型的數(shù)據(jù),例如整數(shù)、實數(shù)、復(fù)數(shù)、字符串、元組等類型,不能使用列表、集合、字典或其他可變類型的對象作為字典的“鍵”,包含列表等可變數(shù)據(jù)的元組也不能作為字典的“鍵”。字典是可變的,可以動態(tài)地增加、刪除元素,也可以隨時修改元素的“值”。在任何時刻,字典中的“鍵”都不重復(fù),“值”可以重復(fù)。5.1.1創(chuàng)建字典的幾種形式#創(chuàng)建空字典>>>data={}>>>data=dict()#直接使用大括號創(chuàng)建字典>>>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)形式元素的有限長度可迭代對象轉(zhuǎn)換為字典>>>data=dict(zip('abcd','1234'))>>>print(data){'a':'1','b':'2','c':'3','d':'4'}5.1.1創(chuàng)建字典的幾種形式>>>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'}#以參數(shù)的形式指定“鍵”和“值”>>>data=dict(language='Python',version='3.10.6')>>>print(data){'language':'Python','version':'3.10.6'}#以可迭代對象中的元素為“鍵”,創(chuàng)建“值”為空的字典>>>data=dict.fromkeys('abcd')>>>print(data){'a':None,'b':None,'c':None,'d':None}#以可迭代對象中的元素為“鍵”,創(chuàng)建字典,所有元素的“值”相等>>>data=dict.fromkeys('abcd',666)>>>print(data){'a':666,'b':666,'c':666,'d':666}5.1.1創(chuàng)建字典的幾種形式>>>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]}#使用字典推導式創(chuàng)建字典>>>data={num:chr(num)fornuminrange(97,100)}>>>print(data){97:'a',98:'b',99:'c'}#下面這兩種形式屬于函數(shù)式編程模式,運行速度比上面的字典推導式略快>>>data=dict(map(lambdanum:(num,chr(num)),range(97,100)))>>>print(data){97:'a',98:'b',99:'c'}5.1.1創(chuàng)建字典的幾種形式>>>data=dict(zip(range(97,100),map(chr,range(97,100))))>>>print(data){97:'a',98:'b',99:'c'}#字符串對象的maketrans()方法返回表示映射關(guān)系的字典>>>table=str.maketrans('abcd','1234')#字典中的“鍵”和“值”是字符的Unicode編碼>>>print(table){97:49,98:50,99:51,100:52}#標準庫collections中的函數(shù)Counter用來統(tǒng)計有限長度可迭代對象中元素出現(xiàn)次數(shù)#返回類似于字典的Counter對象>>>fromcollectionsimportCounter>>>data=Counter([1,1,2,2,3,1,2,1])#每個元素作為“鍵”,出現(xiàn)次數(shù)作為“值”>>>print(data)Counter({1:4,2:3,3:1})5.1.2字典常用方法(1)字典元素訪問字典支持下標運算,把“鍵”作為下標即可返回對應(yīng)的“值”,如果字典中不存在這個“鍵”會拋出KeyError異常提示不存在指定的“鍵”。使用下標訪問元素“值”時,一般建議配合選擇結(jié)構(gòu)或者異常處理結(jié)構(gòu),以免代碼異常引發(fā)崩潰。5.1.2字典常用方法data={'age':43,'name':'Dong','sex':'male'}key=eval(input('請輸入一個鍵:'))#與選擇結(jié)構(gòu)結(jié)合,先確定“鍵”在字典中再使用下標訪問ifkeyindata:print(data[key])else:print('字典中沒有這個鍵')key=eval(input('再輸入一個鍵:'))#與異常處理結(jié)構(gòu)結(jié)合,如果“鍵”不在字典中再進行相應(yīng)的處理try:print(data[key])except:print('字典中沒有這個鍵')運行結(jié)果為:請輸入一個鍵:'age'39再輸入一個鍵:123字典中沒有這個鍵5.1.2字典常用方法為了避免“鍵”不存在時代碼崩潰拋出異常,一般推薦使用字典的get(key,default=None,/)方法獲取指定“鍵”對應(yīng)的“值”,參數(shù)key指定的“鍵”不存在時返回空值或參數(shù)default指定的值,代碼魯棒性更好一些,至少get()方法調(diào)用不會出錯拋出異常。但這并不意味著使用了get()方法就萬事大吉了,仍需要對該方法的返回值進行必要的檢查,以免后面的代碼引發(fā)異常。5.1.2字典常用方法data={'age':43,'name':'Dong','sex':'male'}print(data.get('age'))#指定的“鍵”存在,返回對應(yīng)的“值”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)#這個檢查非常有必要,如果輸入的內(nèi)容不是字典的“鍵”,返回的空值不是可調(diào)用對象#語句func()會拋出異常TypeError:'NoneType'objectisnotcallableiffunc:print(func())else:print('error')運行結(jié)果為:43None不存在請輸入:f135.1.2字典常用方法字典屬于Python內(nèi)置可迭代對象類型之一,可以將其轉(zhuǎn)換為列表或元組,也可以使用for循環(huán)直接進行遍歷。在這樣的場合中,默認情況下是遍歷字典的“鍵”,如果需要遍歷字典的元素必須使用字典對象的items()方法明確說明,如果需要遍歷字典的“值”則必須使用字典對象的values()方法明確說明。當使用len()、max()、min()、sum()、sorted()、enumerate()、map()、filter()等內(nèi)置函數(shù)以及成員測試運算符in對字典對象進行操作時,也遵循同樣的約定。5.1.2字典常用方法>>>data={'host':'','port':80,'protocol':'TCP'}>>>print(data){'host':'','port':80,'protocol':'TCP'}>>>print(len(data))#查看字典長度,也就是其中元素的個數(shù)3>>>print('port'indata)#查看字典中是否存在以'port'為“鍵”的元素True>>>print(80indata.values())#查看字典中是否存在以80為“值”的元素True>>>print(list(data))#把字典中所有元素的“鍵”轉(zhuǎn)換為列表['host','port','protocol']>>>print(list(data.keys()))#與上一行代碼等價['host','port','protocol']>>>print(list(data.values()))#把字典所有元素的“值”轉(zhuǎn)換為列表['',80,'TCP']>>>print(list(data.items()))#把字典所有的元素轉(zhuǎn)換為列表[('host',''),('port',80),('protocol','TCP')]5.1.2字典常用方法#使用for循環(huán)遍歷字典的“鍵”,直接使用data和使用data.keys()是等價的>>>forkeyindata:print(key)

hostportProtocol#在字典前面加一個星號表示對“鍵”進行解包>>>print(*data,sep=',')host,port,protocol#在字典前面加兩個星號表示把元素解包為關(guān)鍵參數(shù)或“鍵:值”對>>>print({**data,'test':666}){'host':'','port':80,'protocol':'TCP','test':666}#使用for循環(huán)遍歷字典的“值”,必須使用values()方法明確說明>>>forvalueindata.values():print(value)

80TCP5.1.2字典常用方法#使用for循環(huán)遍歷字典的元素,必須使用items()方法明確說明>>>foritemindata.items():print(item)

('host','')('port',80)('protocol','TCP')#items()方法返回結(jié)果的每個元素是一個(key,value)形式的元組#請自行查看data.keys()和data.values()的返回結(jié)果>>>print(data.items())dict_items([('host',''),('port',80),('protocol','TCP')])#使用兩個循環(huán)變量同時遍歷字典元素的“鍵”和“值”#下面的代碼適用于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)若該“鍵”存在,表示修改該“鍵”對應(yīng)元素的“值”;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])可以用來刪除參數(shù)k指定的“鍵”對應(yīng)的元素,同時返回對應(yīng)的“值”,如果字典中沒有k指定的“鍵”并且指定了參數(shù)d就返回d的值,如果沒有k指定的“鍵”并且也沒有指定參數(shù)d就拋出KeyError異常。字典方法popitem()方法用于按LIFO(后進先出)的順序刪除并返回一個2-元組(key,value),其中的兩個元素分別是字典元素的“鍵”和“值”。字典方法clear()用于清空字典中所有元素。另外,也可以使用del刪除指定的“鍵”對應(yīng)的元素。5.1.2字典常用方法>>>data={'host':'','port':8080,'scheme':'HTTP'}#指定的“鍵”不存在,并且沒有指定參數(shù)d,拋出異常>>>print(data.pop('protocol'))KeyError:'protocol'#指定的“鍵”不存在,但是指定了參數(shù)d,就返回參數(shù)d的值>>>print(data.pop('protocol','不存在'))不存在#指定的“鍵”存在,直接返回對應(yīng)的元素的“值”,忽略參數(shù)d的內(nèi)容>>>print(data.pop('scheme','不存在'))HTTP>>>print(data){'host':'','port':8080}#刪除并返回字典中最后一個元素>>>print(data.popitem())('port',8080)#刪除指定的“鍵”對應(yīng)的元素,沒有返回值>>>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常用的內(nèi)置可迭代類型之一。集合中所有元素放在一對大括號中,元素之間使用英文半角逗號分隔。同一個集合內(nèi)的每個元素都是唯一的。類似于字典的“鍵”,集合中的元素只能是整數(shù)、實數(shù)、復(fù)數(shù)、字符串、字節(jié)串、元組等不可變或可哈希的數(shù)據(jù),不能包含列表、字典、集合等可變類型或不可哈希的數(shù)據(jù),包含列表或其他可變類型數(shù)據(jù)的元組也不能作為集合的元素。如果試圖把不可哈希數(shù)據(jù)作為集合的元素,會拋出TypeError異常并提示“unhashabletype”。集合是可變的,創(chuàng)建之后可以添加和刪除元素。集合中的元素是無序的,元素存儲順序和添加順序并不一致,先放入集合的元素不一定存儲在前面。集合中的元素不存在“位置”或“索引”的概念,不支持下標和切片。5.2.1創(chuàng)建集合#直接使用大括號創(chuàng)建集合>>>data={'red','green','blue'}#注意,集合中的元素存儲順序和放入的先后順序不一定相同>>>print(data){'blue','red','green'}#注意,{}表示空字典,不能用來創(chuàng)建空集合,應(yīng)使用set()創(chuàng)建空集合>>>data=set()#把range對象轉(zhuǎn)換為集合>>>data=set(range(5))#把列表轉(zhuǎn)換為集合,自動去除重復(fù)的元素>>>data=set([1,2,3,4,3,5,3])>>>print(data){1,2,3,4,5}5.2.1創(chuàng)建集合#把字符串轉(zhuǎn)換為集合,注意,不要在意集合中元素的順序#并且在不同的IDLE會話中元素的順序有可能不一樣>>>data=set('Python')>>>print(data){'h','t','y','n','P','o'}#把map對象轉(zhuǎn)換為集合>>>data=set(map(chr,[97,97,98,99,98,100]))>>>print(data){'a','d','b','c'}#把filter對象轉(zhuǎn)換為集合>>>data=set(filter(None,(3,3,0,False,5,7,True,'a')))>>>print(data){True,3,5,7,'a'}#把zip對象轉(zhuǎn)換為集合>>>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}#當前集合中已經(jīng)存在元素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}#從當前集合中刪除所有參數(shù)可迭代對象中的元素>>>data.difference_update([99],(100,105),{97})>>>print(data){98,101,102,103,666}5.2.2集合常用方法#計算當前集合與所有參數(shù)可迭代對象的交集,更新當前集合>>>ersection_update(range(97,105),(103,105),{98,103,666})>>>print(data){103}#從集合中刪除并返回任意一個元素>>>print(data.pop())103#試圖對空集合調(diào)用pop()方法會拋出異常>>>print(data.pop())KeyError:'popfromanemptyset'#對空集合調(diào)用clear()刪除所有元素,不會拋出異常>>>data.clear()#空集合使用set()創(chuàng)建和表示,而不是{}>>>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()用來返回當前集合與另外一個集合或有限長度的其他類型可迭代對象的對稱差集,這些方法的參數(shù)不必須是集合,可以是有限長度的任意可迭代對象。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}#對稱差集,參數(shù)不必須是集合,可以是有限長度的任意可迭代對象>>>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)集合包含關(guān)系測試集合方法issubset()、issuperset()、isdisjoint()分別用來測試當前集合是否為另一個集合的子集、是否為另一個集合的超集、是否與另一個集合不相鄰(或交集是否為空),這幾個方法的參數(shù)可以任意類型的可迭代對象。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編寫程序,輸入任意字符串,統(tǒng)計并輸出每個唯一字符及其出現(xiàn)次數(shù),要求按每個唯一字符的出現(xiàn)順序輸出。text=input('請輸入任意內(nèi)容:')fre=dict()forchintext:fre[ch]=fre.get(ch,0)+1forch,numberinfre.items():print(ch,number,sep=':')運行結(jié)果為:請輸入任意內(nèi)容:gabcddcbaeg:1a:2b:2c:2d:2e:15.3綜合例題解析例5-2檢查一個集合是否為和諧集,也就是從中刪除任意一個元素之后,剩余元素可以分成兩個集合,并且兩個集合中的元素相加之和相等。5.3綜合例題解析fromitertoolsimportcombinationsdefcheck(data):#保存所有可能的拆分結(jié)果result={}#依次取出每個數(shù),檢查剩余元素是否能恰好等分fornumindata:#t是從data中取出num后的剩余元素組成的集合t=data-{num}s=sum(t)#如果剩余元素之和為奇數(shù),肯定不是和諧集,不需要再判斷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綜合例題解析#需要檢查是否為和諧集的數(shù)據(jù)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('拆分結(jié)果:')fork,vinresult.items():print(k,v,sep=':')else:print('不是和諧集')運行結(jié)果為:=========={1,3,5,7,9,11,13}

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論