感覺(jué)自己的pc快被自己折騰壞了晋涣,換了內(nèi)存以后重啟就藍(lán)屏,今天搞完事情要完整地看一下怎么處理扮叨。
第6章 字典
在本章中,你將學(xué)習(xí)能夠?qū)⑾嚓P(guān)信息關(guān)聯(lián)起來(lái)的Python字典领迈。你將學(xué)習(xí)如何訪問(wèn)和修改字典中的信息彻磁。鑒于字典可存儲(chǔ)的信息量幾乎不受限制,因此我們會(huì)演示如何遍歷字典中的數(shù)據(jù)狸捅。另外衷蜓,你還將學(xué)習(xí)存儲(chǔ)字典的列表、存儲(chǔ)列表的字典和存儲(chǔ)字典的字典尘喝。
理解字典后磁浇,你就能夠更準(zhǔn)確地為各種真實(shí)物體建模。你可以創(chuàng)建一個(gè)表示人的字典朽褪,然后想在其中存儲(chǔ)多少信息就存儲(chǔ)多少信息:姓名置吓、年齡、地址缔赠、職業(yè)以及要 描述的任何方面衍锚。你還能夠存儲(chǔ)任意兩種相關(guān)的信息,如一系列單詞及其含義嗤堰,一系列人名及其喜歡的數(shù)字戴质,以及一系列山脈及其海拔等。
6.1 一個(gè)簡(jiǎn)單的字典
來(lái)看一個(gè)游戲踢匣,其中包含一些外星人告匠,這些外星人的顏色和點(diǎn)數(shù)各不相同。下面是一個(gè)簡(jiǎn)單的字典离唬,存儲(chǔ)了有關(guān)特定外星人的信息:
alien_0 = {'color':'green','points':5}
print(alien_0['color'])
print(alien_0['points'])
運(yùn)行結(jié)果:
6.2 使用字典
在Python中后专,字典是一系列鍵—值對(duì) 。每個(gè)鍵都與一個(gè)值相關(guān)聯(lián)男娄,你可以使用鍵來(lái)訪問(wèn)與之相關(guān)聯(lián)的值行贪。與鍵相關(guān)聯(lián)的值可以是數(shù)字漾稀、字符串、列表乃至字典建瘫。事實(shí)上崭捍,可將任何Python對(duì)象用作字典中的值。
在Python中啰脚,字典用放在花括號(hào){} 中的一系列鍵—值對(duì)表示殷蛇,如前面的示例所示:
alien_0 = {'color':'green','points':5}
鍵—值對(duì)是兩個(gè)相關(guān)聯(lián)的值。指定鍵時(shí)橄浓,Python將返回與之相關(guān)聯(lián)的值粒梦。鍵和值之間用冒號(hào)分隔,而鍵—值對(duì)之間用逗號(hào)分隔荸实。在字典中匀们,你想存儲(chǔ)多少個(gè)鍵—值對(duì)都可以。 最簡(jiǎn)單的字典只有一個(gè)鍵—值對(duì)准给,如下述修改后的字典alien_0 所示:
alien_0 = {'color':'green'}
6.2.1 訪問(wèn)字典中國(guó)中的值
要獲取與鍵相關(guān)聯(lián)的值泄朴,可依次指定字典名和放在方括號(hào)內(nèi)的鍵,如下所示:
alien_0 = {'color':'green'}
print(alien_0['color'])
運(yùn)行結(jié)果:
6.2.2添加鍵—值對(duì)
字典是一種動(dòng)態(tài)結(jié)構(gòu)露氮,可隨時(shí)在其中添加鍵—值對(duì)祖灰。要添加鍵—值對(duì),可依次指定字典名畔规、用方括號(hào)括起的鍵和相關(guān)聯(lián)的值局扶。
下面在字典alien_0 中添加兩項(xiàng)信息:外星人的 x 坐標(biāo)和 y 坐標(biāo),讓我們能夠在屏幕的特定位置顯示該外星人叁扫。我們將這個(gè)外星人放在屏幕左邊緣三妈,且離屏幕上邊緣25像素的地 方。由于屏幕坐標(biāo)系的原點(diǎn)通常為左上角陌兑,因此要將該外星人放在屏幕左邊緣沈跨,可將 x 坐標(biāo)設(shè)置為0;要將該外星人放在離屏幕頂部25像素的地方,可將 y 坐標(biāo)設(shè)置為25兔综,如下所示:
alien_0 = {'color':'green','points':5}
print(alien_0)
alien_0['x_position'] = 0
alien_0['y_position'] = 25
print(alien_0)
運(yùn)行結(jié)果
6.2.3 先創(chuàng)建一個(gè)空字典
有時(shí)候饿凛,在空字典中添加鍵—值對(duì)是為了方便,而有時(shí)候必須這樣做软驰。為此涧窒,可先使用一對(duì)空的花括號(hào)定義一個(gè)字典,再分行添加各個(gè)鍵—值對(duì)锭亏。例如纠吴,下例演示了如何以這種
方式創(chuàng)建字典alien_0 :
alien_0 = {}
alien_0['color'] = 'green'
alien_0['point'] = 5
print(alien_0)
6.2.4 修改字典中的值
要修改字典中的值,可依次指定字典名慧瘤、用方括號(hào)括起的鍵以及與該鍵相關(guān)聯(lián)的新值戴已。例如固该,假設(shè)隨著游戲的進(jìn)行,需要將一個(gè)外星人從綠色改為黃色:
alien_0 = {}
alien_0['color'] = 'green'
alien_0['point'] = 5
print("The alien is " + alien_0['color'] + ".")
alien_0['color'] = 'yellow'
print("The alien is " + alien_0['color'] + ".")
運(yùn)行結(jié)果:
來(lái)看一個(gè)更有趣的例子:對(duì)一個(gè)能夠以不同速度移動(dòng)的外星人的位置進(jìn)行跟蹤糖儡。為此伐坏,我們將存儲(chǔ)該外星人的當(dāng)前速度,并據(jù)此確定該外星人將向右移動(dòng)多遠(yuǎn):
alien_0 = {'x_position':0,'y_position':25,'speed':'medium'}
print("Original x-position: " + str(alien_0['x_position']))
# 向右移動(dòng)外星人
# 據(jù)外星人當(dāng)前速度決定將其移動(dòng)多遠(yuǎn)
if alien_0['speed'] == 'slow':
x_increment = 1
elif alien_0['speed'] == 'medium':
x_increment = 2
else:
x_increment = 3
#新位置等于老位置加增量
alien_0['x_position'] = alien_0['x_position'] + x_increment
print("New x-position: " + str(alien_0['x_position']))
運(yùn)行結(jié)果:
6.2.5 刪除鍵—值對(duì)
對(duì)于字典中不再需要的信息握联,可使用del 語(yǔ)句將相應(yīng)的鍵—值對(duì)徹底刪除桦沉。使用del 語(yǔ)句時(shí),必須指定字典名和要?jiǎng)h除的鍵金闽。 例如纯露,下面的代碼從字典alien_0 中刪除鍵'points' 及其值:
alien = {'color':'green','point':5}
print(alien_0)
del alien_0['point']
print(alien_0)
運(yùn)行結(jié)果:
6.2.6 由類(lèi)似對(duì)象組成的字典
在前面的示例中,字典存儲(chǔ)的是一個(gè)對(duì)象(游戲中的一個(gè)外星人)的多種信息代芜,但你也可以使用字典來(lái)存儲(chǔ)眾多對(duì)象的同一種信息埠褪。例如,假設(shè)你要調(diào)查很多人蜒犯,詢(xún)問(wèn)他們最喜 歡的編程語(yǔ)言组橄,可使用一個(gè)字典來(lái)存儲(chǔ)這種簡(jiǎn)單調(diào)查的結(jié)果,如下所示:
favorite_languages = {
'jen': 'python',
'sarah': 'c',
'edward': 'ruby',
'phil': 'python',
}
給定被調(diào)查者的名字罚随,可使用這個(gè)字典輕松地獲悉他喜歡的語(yǔ)言:
favorite_languages = {
'jen': 'python',
'sarah': 'c',
'edward': 'ruby',
'phil': 'python',
}
print("Sarah's favorite language is " + favorite_languages['sarah'])
運(yùn)行結(jié)果:
6.3 遍歷字典
一個(gè)Python字典可能只包含幾個(gè)鍵—值對(duì),也可能包含數(shù)百萬(wàn)個(gè)鍵—值對(duì)羽资。鑒于字典可能包含大量的數(shù)據(jù)淘菩,Python支持對(duì)字典遍歷。字典可用于以各種方式存儲(chǔ)信息屠升,因此有多種遍歷字典的方式:可遍歷字典的所有鍵—值對(duì)潮改、鍵或值。
6.3.1 遍歷所有的鍵—值對(duì)
user_0 = {
'username':'efermi',
'first':'enrico',
'last':'fermi',
}
for key,value in user_0.items():
print("\nKey: " + key)
print("Value: " + value)
運(yùn)行結(jié)果:
在6.2.6節(jié)的示例favorite_languages.py中腹暖,字典存儲(chǔ)的是不同人的同一種信息;對(duì)于類(lèi)似這樣的字典汇在,遍歷所有的鍵—值對(duì)很合適。如果遍歷字典favorite_languages 脏答,將得到 其中每個(gè)人的姓名和喜歡的編程語(yǔ)言糕殉。由于其中的鍵都是人名,而值都是語(yǔ)言殖告,因此我們?cè)谘h(huán)中使用變量name 和language 阿蝶,而不是key 和value ,這讓人更容易明白循環(huán)的作用:
favorite_languages = {
'jen': 'python',
'sarah': 'c',
'edward': 'ruby',
'phil': 'python',
}
for name,language in favorite_languages.items():
print(name.title() + "'s favorite language is " +
language.title() + ".")
運(yùn)行結(jié)果:
6.3.2 遍歷字典中的所有鍵
在不需要使用字典中的值時(shí)黄绩,方法keys() 很有用羡洁。下面來(lái)遍歷字典favorite_languages ,并將每個(gè)被調(diào)查者的名字都打印出來(lái):
for name in favorite_languages.keys():
print(name.title())
運(yùn)行結(jié)果:
遍歷字典時(shí)爽丹,會(huì)默認(rèn)遍歷所有的鍵筑煮,因此辛蚊,如果將上述代碼中的for name in favorite_languages.keys():替換為for name in favorite_languages:,輸出 將不變真仲。
如果顯式地使用方法keys() 可讓代碼更容易理解嚼隘,你可以選擇這樣做,但如果你愿意袒餐,也可省略它飞蛹。(初學(xué)還是不要省略,容易看不懂) 在這種循環(huán)中灸眼,可使用當(dāng)前鍵來(lái)訪問(wèn)與之相關(guān)聯(lián)的值卧檐。
下面來(lái)打印兩條消息,指出兩位朋友喜歡的語(yǔ)言焰宣。我們像前面一樣遍歷字典中的名字霉囚,但在名字為指定朋友的名字時(shí),打印一條消息匕积,指出其喜歡的語(yǔ)言:
favorite_languages = {
'jen': 'python',
'sarah': 'c',
'edward': 'ruby',
'phil': 'python',
}
friends = ['phil','sarah']
for name in favorite_languages.keys():
print(name.title())
if name in friends:
print("Hi " + name.title() +
", I see your favorite language is " +
favorite_languages[name].title() + "!")
運(yùn)行結(jié)果:
6.3.3 按順序遍歷字典中的所有鍵
字典總是明確地記錄鍵和值之間的關(guān)聯(lián)關(guān)系盈罐,但獲取字典的元素時(shí),獲取順序是不可預(yù)測(cè)的闪唆。這不是問(wèn)題盅粪,因?yàn)橥ǔD阆胍闹皇谦@取與鍵相關(guān)聯(lián)的正確的值。 要以特定的順序返回元素悄蕾,一種辦法是在for 循環(huán)中對(duì)返回的鍵進(jìn)行排序票顾。為此,可使用函數(shù)sorted() 來(lái)獲得按特定順序排列的鍵列表的副本:
favorite_languages = {
'jen': 'python',
'sarah': 'c',
'edward': 'ruby',
'phil': 'python',
}
friends = ['phil','sarah']
for name in sorted(favorite_languages.keys()):
print(name.title())
if name in friends:
print("Hi " + name.title() +
", I see your favorite language is " +
favorite_languages[name].title() + "!")
運(yùn)行結(jié)果:
6.3.4 遍歷字典中的所有值
如果你感興趣的主要是字典包含的值帆调,可使用方法values() 奠骄,它返回一個(gè)值列表,而不包含任何鍵番刊。例如含鳞,如果我們想獲得一個(gè)這樣的列表,即其中只包含被調(diào)查者選擇的各種語(yǔ)言芹务,而不包含被調(diào)查者的名字蝉绷,可以這樣做:
favorite_languages = {
'jen': 'python',
'sarah': 'c',
'edward': 'ruby',
'phil': 'python',
}
print("The following languages have been mentioned:")
for language in favorite_languages.values():
print(language.title())
運(yùn)行結(jié)果:
這種做法提取字典中所有的值,而沒(méi)有考慮是否重復(fù)锄禽。涉及的值很少時(shí)潜必,這也許不是問(wèn)題,但如果被調(diào)查者很多沃但,最終的列表可能包含大量的重復(fù)項(xiàng)磁滚。為剔除重復(fù)項(xiàng),可使用集合(set)。集合類(lèi)似于列表垂攘,但每個(gè)元素都必須是獨(dú)一無(wú)二的:
favorite_languages = {
'jen': 'python',
'sarah': 'c',
'edward': 'ruby',
'phil': 'python',
}
print("The following languages have been mentioned:")
for language in set(favorite_languages.values()):
print(language.title())
運(yùn)行結(jié)果:
6.4 嵌套
有時(shí)候维雇,需要將一系列字典存儲(chǔ)在列表中,或?qū)⒘斜碜鳛橹荡鎯?chǔ)在字典中晒他,這稱(chēng)為嵌套 吱型。你可以在列表中嵌套字典、在字典中嵌套列表甚至在字典中嵌套字典陨仅。正如下面的示例
將演示的津滞,嵌套是一項(xiàng)強(qiáng)大的功能。
6.4.1 字典列表
字典alien_0 包含一個(gè)外星人的各種信息灼伤,但無(wú)法存儲(chǔ)第二個(gè)外星人的信息触徐,更別說(shuō)屏幕上全部外星人的信息了。如何管理成群結(jié)隊(duì)的外星人呢?一種辦法是創(chuàng)建一個(gè)外星人列表狐赡,其中每個(gè)外星人都是一個(gè)字典撞鹉,包含有關(guān)該外星人的各種信息。例如颖侄,下面的代碼創(chuàng)建一個(gè)包含三個(gè)外星人的列表:
alien_0 = {'color':'green','points':5}
alien_1 = {'color':'yellow','points':10}
alien_2 = {'color':'red','points':15}
aliens = [alien_0,alien_1,alien_2]
for alien in aliens:
print(alien)
運(yùn)行結(jié)果:
更符合現(xiàn)實(shí)的情形是鸟雏,外星人不止三個(gè),且每個(gè)外星人都是使用代碼自動(dòng)生成的览祖。在下面的示例中孝鹊,我們使用range() 生成了30個(gè)外星人:
#創(chuàng)建30個(gè)綠色的外星人
for alien_number in range(30):
new_alien = {'color':'green','points':5,'speed':'slow'}
aliens.append(new_alien)
#顯示前5個(gè)外星人
for alien in aliens[:5]:
print(alien)
print("...")
#顯示創(chuàng)建了多少個(gè)外星人
print("Total number of aliens: " + str(len(aliens)))
運(yùn)行結(jié)果:
這些外星人都具有相同的特征,但在Python看來(lái)穴墅,每個(gè)外星人都是獨(dú)立的惶室,這讓我們能夠獨(dú)立地修改每個(gè)外星人。 在什么情況下需要處理成群結(jié)隊(duì)的外星人呢?想象一下玄货,可能隨著游戲的進(jìn)行,有些外星人會(huì)變色且移動(dòng)速度會(huì)加快悼泌。必要時(shí)松捉,我們可以使用for 循環(huán)和if 語(yǔ)句來(lái)修改某些外星人的顏色匪蟀。例如攒发,要將前三個(gè)外星人修改為黃色的谨垃、速度為中等且值10個(gè)點(diǎn)尽楔,可以這樣做:
#創(chuàng)建一個(gè)用于存儲(chǔ)外星人的空列表
aliens = []
#創(chuàng)建30個(gè)綠色的外星人
for alien_number in range(30):
new_alien = {'color':'green','points':5,'speed':'slow'}
aliens.append(new_alien)
#修改部分外星人
for alien in aliens[:3]:
if alien['color'] == 'green':
alien['color'] = 'yellow'
alien['speed'] = 'medium'
alien['points'] = 10
#顯示前5個(gè)外星人
for alien in aliens[0:5]:
print(alien)
print("...")
#顯示創(chuàng)建了多少個(gè)外星人
print("Total number of aliens: " + str(len(aliens)))
運(yùn)行結(jié)果:
6.4.2 在字典中存儲(chǔ)列表
有時(shí)候媒楼,需要將列表存儲(chǔ)在字典中哥纫,而不是將字典存儲(chǔ)在列表中悬秉。例如营密,你如何描述顧客點(diǎn)的比薩呢?如果使用列表械媒,只能存儲(chǔ)要添加的比薩配料;但如果使用字典,就不僅可在其中包含配料列表,還可包含其他有關(guān)比薩的描述纷捞。
在下面的示例中痢虹,存儲(chǔ)了比薩的兩方面信息:外皮類(lèi)型和配料列表。其中的配料列表是一個(gè)與鍵'toppings' 相關(guān)聯(lián)的值主儡。要訪問(wèn)該列表奖唯,我們使用字典名和鍵'toppings' ,就像訪問(wèn)字典中的其他值一樣糜值。這將返回一個(gè)配料列表丰捷,而不是單個(gè)值:
# 存儲(chǔ)所點(diǎn)披薩的信息
pizza = {
'crust':'thick',
'toppings':['mushrooms','extra cheese']
}
# 概述所點(diǎn)的披薩
print("You ordered a " + pizza['crust'] + "-crust pizza" +
" with the following toppings:")
for topping in pizza['toppings']:
print("\t" + topping)
運(yùn)行結(jié)果:
每當(dāng)需要在字典中將一個(gè)鍵關(guān)聯(lián)到多個(gè)值時(shí),都可以在字典中嵌套一個(gè)列表寂汇。在本章前面有關(guān)喜歡的編程語(yǔ)言的示例中病往,如果將每個(gè)人的回答都存儲(chǔ)在一個(gè)列表中,被調(diào)查者就可選擇多種喜歡的語(yǔ)言健无。在這種情況下荣恐,當(dāng)我們遍歷字典時(shí),與每個(gè)被調(diào)查者相關(guān)聯(lián)的都是一個(gè)語(yǔ)言列表累贤,而不是一種語(yǔ)言;因此叠穆,在遍歷該字典的for 循環(huán)中,我們需要再使 用一個(gè)for 循環(huán)來(lái)遍歷與被調(diào)查者相關(guān)聯(lián)的語(yǔ)言列表:
favorite_languages = {
'jen':['python','ruby'],
'sarah':['c'],
'edward':['ruby','go'],
'phil':['python','haskell'],
}
for name,languages in favorite_languages.items():
print("\n" + name.title() + "'s favorite languages are:")
for language in languages:
print("\t" + language.title())
運(yùn)行結(jié)果:
6.4.3在字典中存儲(chǔ)字典
可在字典中嵌套字典臼膏,但這樣做時(shí)硼被,代碼可能很快復(fù)雜起來(lái)。例如渗磅,如果有多個(gè)網(wǎng)站用戶(hù)嚷硫,每個(gè)都有獨(dú)特的用戶(hù)名,可在字典中將用戶(hù)名作為鍵始鱼,然后將每位用戶(hù)的信息存儲(chǔ)在一個(gè)字典中仔掸,并將該字典作為與用戶(hù)名相關(guān)聯(lián)的值。在下面的程序中医清,對(duì)于每位用戶(hù)起暮,我們都存儲(chǔ)了其三項(xiàng)信息:名、姓和居住地;為訪問(wèn)這些信息会烙,我們遍歷所有的用戶(hù)名负懦, 并訪問(wèn)與每個(gè)用戶(hù)名相關(guān)聯(lián)的信息字典:
users = {
'aeinstein':{
'first':'albert',
'last':'einstein',
'location':'princeton',
},
'mcurie':{
'first':'marie',
'last':'curie',
'location':'paris',
}
}
for username,user_info in users.items():
print("\nUsername: " + username)
full_name = user_info['first'] + " " + user_info['last']
location = user_info['location']
print("\tFull name: " + full_name.title())
print("\tLocation: " + location.title())
運(yùn)行結(jié)果:
6.5 總結(jié)
在本章中,你學(xué)習(xí)了:
- 如何定義字典
- 如何使用存儲(chǔ)在字典中的信息
- 如何訪問(wèn)和修改字典中的元素
- 如何遍歷字典中的所有信息;如何遍歷字典中所有的鍵-值對(duì)柏腻、所
有的鍵和所有的值 - 如何在列表中嵌套字典纸厉、在字典中嵌套列表以及在字典中嵌套字典
這個(gè)嵌套真的是夠我琢磨一陣子的,就到這里吧~