Python 基礎(chǔ)第七講:怎么理解字典呢?

4.5.1 什么是字典
字典是另外一個(gè)可變的數(shù)據(jù)結(jié)構(gòu),且可存儲(chǔ)任意類(lèi)型對(duì)象,比如字符串、數(shù)字、列表等。字典是由關(guān)鍵字和值兩部分組成,也就是 key 和 value,中間用冒號(hào)分隔。這種結(jié)構(gòu)類(lèi)似于新華字典,字典中每一個(gè)字都有一個(gè)對(duì)應(yīng)的解釋?zhuān)唧w語(yǔ)法如下:
語(yǔ)法:
字典名 = { 關(guān)鍵字1:值,關(guān)鍵字2:值,關(guān)鍵字3:值}
每個(gè)鍵與值用冒號(hào)隔開(kāi)(:),每對(duì)用逗號(hào)分割,整體放在花括號(hào)中({})。
鍵必須獨(dú)一無(wú)二,但值則不必??梢杂腥我舛鄠€(gè)鍵值對(duì)
值可以取任何數(shù)據(jù)類(lèi)型,但鍵必須是不可變的,如字符串,數(shù)或元組。
例子:
#構(gòu)建一個(gè)字典,記錄各宮嬪妃的年薪銀子
name_dictionary = {'魏瓔珞':300,'皇后':1000,'皇貴妃':800,'貴妃':600,'斌':200}
print(name_dictionary)
print('字典的數(shù)據(jù)類(lèi)型表示是:',type(name_dictionary))
{'魏瓔珞': 300, '皇后': 1000, '皇貴妃': 800, '貴妃': 600, '斌': 200}
字典的數(shù)據(jù)類(lèi)型表示是: <class 'dict'>
4.5.2 字典特性
字典值可以沒(méi)有限制地取任何python對(duì)象,既可以是標(biāo)準(zhǔn)的對(duì)象,也可以是用戶(hù)定義的,但鍵不行。兩個(gè)重要的點(diǎn)需要記?。?/span>
1.不允許同一個(gè)鍵出現(xiàn)兩次:創(chuàng)建時(shí)如果同一個(gè)鍵被賦值兩次,后一個(gè)值會(huì)被記住。
例子
# 定義兩個(gè)同樣的關(guān)鍵字Namedict = {'Name': 'Python', 'Age': 7, 'Name': 'Java'}print("dict['Name']: ", dict['Name'])
dict['Name']: ManniJava
2. 鍵必須不可變:所以可以用數(shù),字符串或元組充當(dāng),所以用列表就不行
例子
# 關(guān)鍵字Name為列表dict = {['Name']:'Python', 'Age': 7};print ("dict['Name']: ", dict['Name'])
File "/Users/yoni.ma/PycharmProjects/seven_days_python/Forth_day_strcure/dict_p.py", line 22, in <module>
dict['Name']: Java
dict = {['Name']:'Python', 'Age': 7};
TypeError: unhashable type: 'list'
4.5.3 字典的基本操作
字典在python中的類(lèi)型表示是 <class 'dict'>。當(dāng)查看到變量的類(lèi)型是dict,則可以對(duì)其進(jìn)行字典的操作。常見(jiàn)的字典操作是訪(fǎng)問(wèn)字典、遍歷字典等。這些操作在實(shí)際項(xiàng)目中經(jīng)常被使用到,比如excel文件讀入內(nèi)存以后,按照字典的方法存放。然后對(duì)其增加或刪除值。
1.訪(fǎng)問(wèn)字典
訪(fǎng)問(wèn)字典也就是獲取關(guān)鍵字對(duì)應(yīng)的值,方法是指定字典名和放在方括號(hào)內(nèi)的關(guān)鍵字,具體如下。獲取后的值可以賦值給變量。
語(yǔ)法:
變量名 = 字典名[關(guān)鍵字]
例子
# 訪(fǎng)問(wèn)字典
weiyingluo = name_dictionary['魏瓔珞']
print(f'魏瓔珞的年薪是:{weiyingluo}兩')
魏瓔珞的年薪是:300兩
2.添加鍵值對(duì)
字典是一種可變的數(shù)據(jù)結(jié)構(gòu),可以隨時(shí)添加或者刪除其中的鍵值對(duì)。其中添加鍵值的方法是,指定字典名、用方括號(hào)括起的鍵和相關(guān)的值,具體如下。
語(yǔ)法:
字典名[關(guān)鍵字名] = 值
例子
# 增加貴人和常在的年薪銀子
print(f'原來(lái)的后宮年薪字典是:{name_dictionary}')
name_dictionary['貴人'] = 100
name_dictionary['常在'] = 50
print(F'增加鍵值后的后宮年薪字典變成:{name_dictionary}')
原來(lái)的后宮年薪字典是:{'魏瓔珞': 300, '皇后': 1000, '皇貴妃': 800, '貴妃': 600, '斌': 200}
增加鍵值后的后宮年薪字典變成:{'魏瓔珞': 300, '皇后': 1000, '皇貴妃': 800, '貴妃': 600, '斌': 200, '貴人': 100, '常在': 50}
3.修改鍵值對(duì)
如果字典中的值不是我們想要的,可以通過(guò)修改的方法達(dá)到。以此指定字典名、用方括號(hào)括起的鍵以及與該鍵相對(duì)應(yīng)的新值。
語(yǔ)法:
字典名[關(guān)鍵字名] = 新的值
例子
# 修改字典的值,比如修改常在的年薪為70兩
print('常在原來(lái)的年薪是{} 兩'.format(name_dictionary['常在']))
name_dictionary['常在']= 70
change_changzai = name_dictionary['常在']
print(f'常在修改后的年薪是{change_changzai} 兩')
常在原來(lái)的年薪是50 兩
常在修改后的年薪是70 兩
4刪除鍵值對(duì)
如果字典中的鍵值對(duì)不再需要,我們可以徹底刪除。Python使用的是del語(yǔ)句,必須要指定要?jiǎng)h除的字典名和關(guān)鍵字。注意是永久刪除
語(yǔ)法:
del 字典名[關(guān)鍵字]
例子
#刪除字典中的鍵值對(duì),比如刪除常在
del name_dictionary['常在']
print(f'刪除常在后的后宮嬪妃年薪字典變成:{name_dictionary}')
刪除常在后的后宮嬪妃年薪字典變成:{'魏瓔珞': 300, '皇后': 1000, '皇貴妃': 800, '貴妃': 600, '斌': 200, '貴人': 100}
如果我們還需要用到被刪除的鍵值對(duì),則我們使用pop(‘鍵的名字’)方法。該方法是刪除字典給定鍵所對(duì)應(yīng)的值,并且返回該值。
print('原來(lái)的字典是:', name_dictionary)# 使用pop方法刪除魏瓔珞name_pop = name_dictionary.pop('魏瓔珞')# 使用刪除后的值print('魏瓔珞的年薪是:',name_pop)print('使用pop方法刪除后的字典是:',name_dictionary)
原來(lái)的字典是: {'魏瓔珞': 300, '皇后': 1000, '皇貴妃': 800, '貴妃': 600, '斌': 200, '貴人': 100}
魏瓔珞的年薪是: 300
使用pop方法刪除后的字典是: {'皇后': 1000, '皇貴妃': 800, '貴妃': 600, '斌': 200, '貴人': 100}
除了pop()方法以外, Python中還有一個(gè)popitem()方法。它可以隨機(jī)刪除字典中的一對(duì)(一般刪除末尾一對(duì)),并且可以被后續(xù)的程序使用。我們經(jīng)常用此方法逐個(gè)刪除字典中的所有鍵值對(duì)。
# 隨機(jī)刪除字典中的一對(duì)pop_name = name_dictionary.popitem()print('使用popitem刪除的是:',pop_name)print('隨機(jī)刪除字典中一對(duì)鍵值對(duì)后:',name_dictionary)pop2_name = name_dictionary.popitem()print('再次使用popitem刪除的是:',pop2_name)print('再次隨機(jī)刪除字典中一對(duì)鍵值對(duì)后:',name_dictionary)
使用popitem刪除的是:('貴人', 100)
隨機(jī)刪除字典中一對(duì)鍵值對(duì)后: {'皇后': 1000, '皇貴妃': 800, '貴妃': 600, '斌': 200}
再次使用popitem刪除的是: ('斌', 200)
再次隨機(jī)刪除字典中一對(duì)鍵值對(duì)后: {'皇后': 1000, '皇貴妃': 800, '貴妃': 600}
如果需要?jiǎng)h除所有的鍵值對(duì),我們可以使用clear()方法清空所有的數(shù)據(jù)。但是需要注意del語(yǔ)句是刪除字典,此時(shí)打印刪除后的字典則出錯(cuò)。兩者是有區(qū)別的。
# clear()方法清除字典中的所有數(shù)據(jù)print('原來(lái)字典的長(zhǎng)度是:',len(name_dictionary))name_dictionary.clear()print('使用clear清除字典中的所有內(nèi)容:',name_dictionary)print('清空以后字典的長(zhǎng)度是:',len(name_dictionary))# 使用del刪除字典del name_dictionary# 字典已經(jīng)被刪除,則再次打印則出錯(cuò):name 'name_dictionary' is not definedprint(name_dictionary)
原來(lái)字典的長(zhǎng)度是: 3
使用clear清除字典中的所有內(nèi)容: {}
清空以后字典的長(zhǎng)度是: 0
Traceback (most recent call last):
File "/Users/seven_days_python/Forth_day_strcure/dict_p.py", line 139, in <module>
print(name_dictionary)
NameError: name 'name_dictionary' is not defined
5.創(chuàng)建空字典
在實(shí)際項(xiàng)目中,我們可能不知道字典中存放的內(nèi)容是什么。這時(shí),我們可以采用從空的字典開(kāi)始動(dòng)態(tài)創(chuàng)建,也就是在程序運(yùn)行的時(shí)候添加具體的內(nèi)容。
常見(jiàn)的使用場(chǎng)景是:第一個(gè):需要用戶(hù)輸入數(shù)據(jù)存儲(chǔ)為字典;第二個(gè)是自動(dòng)生成大量的鍵值對(duì),比如爬蟲(chóng),爬取豆瓣電影的排名信息。我們可以把排名放入空的字典中,然后每次爬取一個(gè)電影,添加一個(gè)對(duì)應(yīng)的鍵值對(duì)。
例子
# 從空的字典開(kāi)始創(chuàng)建
douban_movies = {} #定義空的字典
douban_movies['排名'] = 1
douban_movies['片名'] = '霸王別姬'
douban_movies['主演'] = '張國(guó)榮、張豐毅、鞏俐'
douban_movies['導(dǎo)演'] = '陳凱歌'
print('從空的列表中構(gòu)建字典:',douban_movies)
從空的列表中構(gòu)建字典: {'排名': 1, '片名': '霸王別姬', '主演': '張國(guó)榮、張豐毅、鞏俐', '導(dǎo)演': '陳凱歌'}
4.5.4 內(nèi)置字典函數(shù)與方法
Python字典包含了很多內(nèi)置函數(shù)和方法,部分如下所示。這些函數(shù)或者方法不需要死記硬背,用到的時(shí)候去網(wǎng)絡(luò)或書(shū)中查找即可。
內(nèi)置函數(shù)
cmp(dict1, dict2) #比較兩個(gè)字典元素。
len(dict) #計(jì)算字典元素個(gè)數(shù),即鍵的總數(shù)。
str(dict) #輸出字典可打印的字符串表示。
內(nèi)置方法
字典名.clear() # 刪除字典內(nèi)所有元素
字典名.copy() # 返回一個(gè)字典的淺復(fù)制
字典名.fromkeys() # 創(chuàng)建一個(gè)新字典,以序列seq中元素做字典的鍵,val為字典所有鍵對(duì)應(yīng)的初始值
字典名.get(key, default=None) # 返回指定鍵的值,如果值不在字典中返回default值
字典名.items() # 以列表返回可遍歷的(鍵, 值) 元組數(shù)組
字典名.keys() # 以列表返回一個(gè)字典所有的鍵
字典名.setdefault(key, default=None) # 和get()類(lèi)似, 但如果鍵不已經(jīng)存在于字典中,將會(huì)添加鍵并將值設(shè)為default
字典名.update(dict2) # 把字典dict2的鍵/值對(duì)更新到dict里
字典名.values() # 以列表返回字典中的所有值
例子
# 內(nèi)置函數(shù)和方法
print('計(jì)算字典的個(gè)數(shù):',len(name_dictionary))
print('輸出字典可以打印的字符串',str(name_dictionary))
# 內(nèi)置函數(shù)
print('返回指定的貴妃的年薪',name_dictionary.get('貴妃'))
print('以列表的形式返回字典中的所有關(guān)鍵字,',name_dictionary.keys()) #經(jīng)常被用到
print('以元組形式返回所有的鍵值對(duì)',name_dictionary.items()) #經(jīng)常被用到
print('返回鍵值中的所有值',name_dictionary.values())#經(jīng)常被用到
計(jì)算字典的個(gè)數(shù): 6
輸出字典可以打印的字符串 {'魏瓔珞': 300, '皇后': 1000, '皇貴妃': 800, '貴妃': 600, '斌': 200, '貴人': 100}
返回指定的貴妃的年薪 600
以列表的形式返回字典中的所有關(guān)鍵字, dict_keys(['魏瓔珞', '皇后', '皇貴妃', '貴妃', '斌', '貴人'])
以元組形式返回所有的鍵值對(duì) dict_items([('魏瓔珞', 300), ('皇后', 1000), ('皇貴妃', 800), ('貴妃', 600), ('斌', 200), ('貴人', 100)])
返回鍵值中的所有值 dict_values([300, 1000, 800, 600, 200, 100])
在所有內(nèi)置方法中,update()方法經(jīng)常被用來(lái)合并兩個(gè)字典。如果傳給update方法的數(shù)據(jù)也含有相同的鍵,則它的值將被覆蓋。
new_dictionary = {'皇后': 1000, '皇貴妃': 800, '貴妃': 600}print('第一個(gè)字典:',new_dictionary)name = {'魏瓔珞': 300, '貴人': 100}print('第二個(gè)字典:',name)# 使用update方法合并兩個(gè)字典new_dictionary.update(name)print('使用update方法合并兩個(gè)字典:', new_dictionary)# 如果有重復(fù)的值則替換name_new = {'皇后':1500, '貴人':110}# 使用update方法合并兩個(gè)字典new_dictionary.update(name_new)print('使用update方法合并兩個(gè)字典:', new_dictionary)
第一個(gè)字典: {'皇后': 1000, '皇貴妃': 800, '貴妃': 600}
第二個(gè)字典: {'魏瓔珞': 300, '貴人': 100}
使用update方法合并兩個(gè)字典: {'皇后': 1000, '皇貴妃': 800, '貴妃': 600, '魏瓔珞': 300, '貴人': 100}
使用update方法合并兩個(gè)字典: {'皇后': 1500, '皇貴妃': 800, '貴妃': 600, '魏瓔珞': 300, '貴人': 110}
4.6 結(jié)合字典與列表
字典和列表是python中經(jīng)常用到的兩個(gè)數(shù)據(jù)結(jié)構(gòu),并且都是可變的。有時(shí)候,我們需要把兩者結(jié)合起來(lái)使用。把一系列字典存儲(chǔ)在列表中,或?qū)⒘斜碜鳛橹捣旁谧值渲?,這稱(chēng)為嵌套。你可以在列表中嵌套字典、在字典中嵌套列表甚至在字典中嵌套字典。這在項(xiàng)目中經(jīng)常用到。
什么時(shí)候用列表什么時(shí)候用字典呢?面對(duì)這個(gè)問(wèn)題筆者的想法是,當(dāng)你存取的數(shù)據(jù)類(lèi)型都是一樣的時(shí)候,使用列表,當(dāng)你存取的數(shù)據(jù)類(lèi)型不一樣時(shí)就用字典。這里說(shuō)明一下數(shù)據(jù)類(lèi)型不一樣不是指整形或者字符型。舉個(gè)例子:如果你需要存很多人的姓名,僅僅這一個(gè)屬性,就用列表來(lái)進(jìn)行處理,當(dāng)你要存取不僅僅是人名,包括年齡,性別,國(guó)籍等等這些信息時(shí),這時(shí)候用字典是最合適的。
4.6.1 字典列表
列表中的元素都是字典為字典列表。一般用在列表的元素信息比較復(fù)雜,單一的字符串不能滿(mǎn)足。
例子
# 兩個(gè)字典合并為一個(gè)列表dict_1 = {'name':'Python','age':18}dict_2 = {'name':'Java', 'age':'unknown'}name_list = [dict_1,dict_2]print(name_list)print('類(lèi)型是:',type(name_list))
[{'name': 'Python', 'age': 18}, {'name': 'Java', 'age': 'unknown'}]
類(lèi)型是: <class 'list'>
4.6.2 在字典中存儲(chǔ)列表
字典中的值有時(shí)候不是一個(gè),而是多個(gè)。這時(shí)需要把字典中的值變成一個(gè)列表,而不是單個(gè)的值。
例子
# 字典中存儲(chǔ)列表
favorite_actor = {
'魏瓔珞':['傅恒','皇上','富察皇后'],
'皇上':['魏瓔珞','富察皇后','純妃','高貴妃'],
'高貴妃':'皇上'
}
print(favorite_actor)
print('類(lèi)型是',type(favorite_actor))
結(jié)果為:
{'魏瓔珞': ['傅恒', '皇上', '富察皇后'], '皇上': ['魏瓔珞', '富察皇后', '純妃', '高貴妃'], '高貴妃': '皇上'}
類(lèi)型是 <class 'dict'>
4.6.3 在字典中存儲(chǔ)字典
字典的值也可以是字典,稱(chēng)為字典中存儲(chǔ)字典。一般用在鍵對(duì)應(yīng)的值是二維的信息,比如登錄某一個(gè)網(wǎng)站的用戶(hù)信息,用戶(hù)名是鍵,用戶(hù)名對(duì)應(yīng)的值比較部分,既包括用戶(hù)的地址、職業(yè)、收入等信息。
例子
# 字典中存儲(chǔ)字典
users = {
'愛(ài)上不該愛(ài)的人': {
'姓名':'魏瓔珞',
'職位':"妃子",
'年薪':'300兩',},
'只愛(ài)皇上':{
'姓名':'高貴妃',
'職位':'貴妃',
'年薪':'800兩',}
}
print(users)
print('類(lèi)型是',type(users))
{'愛(ài)上不該愛(ài)的人': {'姓名': '魏瓔珞', '職位': '妃子', '年薪': '300兩'}, '只愛(ài)皇上': {'姓名': '高貴妃', '職位': '貴妃', '年薪': '800兩'}}
類(lèi)型是 <class 'dict'>
以上內(nèi)容摘自《零基礎(chǔ)輕松學(xué) Python》
零基礎(chǔ)學(xué) Python,看下嘛
只需7天時(shí)間,跨進(jìn)Python編程大門(mén),已有3800+加入
【基礎(chǔ)】0基礎(chǔ)入門(mén)python,24小時(shí)有人快速解答問(wèn)題;
【提高】40多個(gè)項(xiàng)目實(shí)戰(zhàn),老手可以從真實(shí)場(chǎng)景中學(xué)習(xí)python;
【直播】不定期直播項(xiàng)目案例講解,手把手教你如何分析項(xiàng)目;
【分享】?jī)?yōu)質(zhì)python學(xué)習(xí)資料分享,讓你在最短時(shí)間獲得有價(jià)值的學(xué)習(xí)資源;圈友優(yōu)質(zhì)資料或?qū)W習(xí)分享,會(huì)不時(shí)給予贊賞支持,希望每個(gè)優(yōu)質(zhì)圈友既能賺回加入費(fèi)用,也能快速成長(zhǎng),并享受分享與幫助他人的樂(lè)趣。
【人脈】收獲一群志同道合的朋友,并且都是python從業(yè)者
【價(jià)格】本著布道思想,只需 69元 加入一個(gè)能保證學(xué)習(xí)效果的良心圈子。
【贈(zèng)予】?jī)r(jià)值109元 0基礎(chǔ)入門(mén)在線(xiàn)課程,免費(fèi)送給圈友們,供鞏固
