MozZhang 2018-09-18 16:25:04 昨晚,一邊看男籃比賽,一邊把第六章學(xué)完了,哈哈哈。。。 直接進(jìn)入正題,在本章中, 將學(xué)習(xí)能夠?qū)⑾嚓P(guān)信息關(guān)聯(lián)起來的Python字典。學(xué)習(xí)如何訪問和修改字典中的信息。 鑒于字典可存儲(chǔ)的信息量幾乎不受限制,因此我們會(huì)演示如何遍歷字典中的數(shù)據(jù)。另外,還將學(xué)習(xí)存儲(chǔ)字典的列表、 存儲(chǔ)列表的字典和存儲(chǔ)字典的字典。由于貼代碼塊時(shí),沒有縮進(jìn),所以我選擇貼代碼的圖,這樣能夠清晰看到縮進(jìn),畢竟python嚴(yán)格縮進(jìn)?。。。?/p> 6.1 一個(gè)簡(jiǎn)單的字典來看一個(gè)游戲, 其中包含一些外星人, 這些外星人的顏色和點(diǎn)數(shù)各不相同。 下面是一個(gè)簡(jiǎn)單的字典, 存儲(chǔ)了有關(guān)特定外星人的信息: alien_0 = {'color' : 'green', 'points' : 5} 字典alien_0 存儲(chǔ)了外星人的顏色和點(diǎn)數(shù)。 使用兩條print 語(yǔ)句來訪問并打印這些信息, 如下所示: 6.2 使用字典在Python中, 字典是一系列鍵(key)—值(value)對(duì) 。 每個(gè)鍵都與一個(gè)值相關(guān)聯(lián), 可以使用鍵來訪問與之相關(guān)聯(lián)的值。 與鍵相關(guān)聯(lián)的值可以是數(shù)字、 字符串、 列表乃至字典。 事實(shí)上, 可將任何Python對(duì)象用作字典中的值。在Python中,字典用放在花括號(hào){} 中的一系列鍵—值對(duì)表示。鍵—值 對(duì)是兩個(gè)相關(guān)聯(lián)的值。指定鍵時(shí),Python將返回與之相關(guān)聯(lián)的值。 鍵和值之間用冒號(hào)分隔, 而鍵—值對(duì)之間用逗號(hào)分隔。 在字典中, 你想存儲(chǔ)多少個(gè)鍵—值對(duì)都可以。 6.2.1 訪問字典中的值要獲取與鍵相關(guān)聯(lián)的值, 可依次指定字典名和放在方括號(hào)內(nèi)的鍵。 alien_0 = {'color' : 'green','points' : 5} 6.2.2 添加鍵—值對(duì)字典是一種動(dòng)態(tài)結(jié)構(gòu),可隨時(shí)在其中添加鍵—值對(duì)。 要添加鍵—值對(duì), 可依次指定字典名、 用方括號(hào)括起的鍵和相關(guān)聯(lián)的值。 alien_0 = {'color':'green', 'points':5}
6.2.3 先創(chuàng)建一個(gè)空字典使用字典來存儲(chǔ)用戶提供的數(shù)據(jù)或在編寫能自動(dòng)生成大量鍵—值對(duì)的代碼時(shí), 通常都需要先定義一個(gè)空字典。 alien_0 = {} 6.2.4 修改字典中的值要修改字典中的值, 可依次指定字典名、 用方括號(hào)括起的鍵以及與該鍵相關(guān)聯(lián)的新值。我們首先定義了一個(gè)表示外星人alien_0 的字典, 其中只包含這個(gè)外星人的顏色。 接下來, 我們將與鍵'color' 相關(guān)聯(lián)的值改為'yellow' 。 alien_0 = {'color':'green'} 來看一個(gè)更有趣的例子: 對(duì)一個(gè)能夠以不同速度移動(dòng)的外星人的位置進(jìn)行跟蹤。 為此, 我們將存儲(chǔ)該外星人的當(dāng)前速度, 并據(jù)此確定該外星人將向右移動(dòng)多遠(yuǎn): 6.2.5 刪除鍵—值對(duì)對(duì)于字典中不再需要的信息, 可使用del 語(yǔ)句將相應(yīng)的鍵—值對(duì)徹底刪除。 使用del 語(yǔ)句時(shí), 必須指定字典名和要?jiǎng)h除的鍵。刪除的鍵—值對(duì)將永遠(yuǎn)消失。 alien_0 = {'color':'green','points':5} 6.2.6 由類似對(duì)象組成的字典確定需要使用多行來定義字典時(shí), 在輸入左花括號(hào)后按回車鍵, 再在下一行縮進(jìn)四個(gè)空格, 指定第一個(gè)鍵—值對(duì), 并在它后面加上一個(gè)逗號(hào)。 此后你再次按回車鍵時(shí), 文本編輯器將自動(dòng)縮進(jìn)后續(xù)鍵—值對(duì), 且縮進(jìn)量與第一個(gè)鍵—值對(duì)相同。在最后一個(gè)鍵—值對(duì)的下一行添加一個(gè)右花括號(hào), 并縮進(jìn)四個(gè)空格, 使其與字典中的鍵對(duì)齊。 另外一種不錯(cuò)的做法是在最后一個(gè)鍵—值對(duì)后面也加上逗號(hào), 為以后在下一行添加鍵—值對(duì)做好準(zhǔn)備。
動(dòng)手試一試6-1 人 : 使用一個(gè)字典來存儲(chǔ)一個(gè)熟人的信息, 包括名、 姓、 年齡和居住的城市。 該字典應(yīng)包含鍵first_name 、 last_name 、 age 和city 。 將存儲(chǔ)在該字典中的每項(xiàng)信息都打印出來。 6-2 喜歡的數(shù)字: 使用一個(gè)字典來存儲(chǔ)一些人喜歡的數(shù)字。 請(qǐng)想出5個(gè)人的名字, 并將這些名字用作字典中的鍵; 想出每個(gè)人喜歡的一個(gè)數(shù)字, 并將這些數(shù)字作為值存儲(chǔ)在字典中。 打印每個(gè)人的名字和喜歡的數(shù)字。 為讓這個(gè)程序更有趣, 通過詢問朋友確保數(shù)據(jù)是真實(shí)的。 ![]() 6.3 遍歷字典6.3.1 遍歷所有的鍵—值對(duì)要編寫用于遍歷字典的for 循環(huán), 可聲明兩個(gè)變量, 用于存儲(chǔ)鍵—值對(duì)中的鍵和值。 對(duì)于這兩個(gè)變量, 可使用任何名稱。for 語(yǔ)句的第二部分包含字典名和方法items() , 它返回一個(gè)鍵—值對(duì)列表。 接下來, for 循環(huán)依次將每個(gè)鍵—值對(duì)存儲(chǔ)到指定的兩個(gè)變量中。 在前面的示例中, 我們使用這兩個(gè)變量來打印每個(gè)鍵及其相關(guān)聯(lián)的值. ![]() ![]()
6.3.2 遍歷字典中的所有鍵在不需要使用字典中的值時(shí), 方法keys() 很有用。方法keys() 并非只能用于遍歷; 實(shí)際上, 它返回一個(gè)列表(但和列表有區(qū)別), 其中包含字典中的所有鍵. ![]() ![]() ![]() ![]() 6.3.3 按順序遍歷字典中的所有鍵字典總是明確地記錄鍵和值之間的關(guān)聯(lián)關(guān)系, 但獲取字典的元素時(shí), 獲取順序是不可預(yù)測(cè)的。 這不是問題, 因?yàn)橥ǔD阆胍闹皇谦@取與鍵相關(guān)聯(lián)的正確的值。要以特定的順序返回元素, 一種辦法是在for 循環(huán)中對(duì)返回的鍵進(jìn)行排序。 為此, 可使用函數(shù)sorted() 來獲得按特定順序排列的鍵列表的副本,但不能使用list.sort()。 ![]() ![]() 6.3.4 遍歷字典中的所有值如果你感興趣的主要是字典包含的值, 可使用方法values() , 它返回一個(gè)值列表, 而不包含任何鍵。 ![]() ![]() 這種做法提取字典中所有的值, 而沒有考慮是否重復(fù)。 涉及的值很少時(shí), 這也許不是問題, 但如果被調(diào)查者很多, 最終的列表可能包含大量的重復(fù)項(xiàng)。 為剔除重復(fù)項(xiàng), 可使用集合(set) 。 集合 類似于列表, 但每個(gè)元素都必須是獨(dú)一無二的。 ![]() ![]() 動(dòng)手試一試6-5 河流 : 創(chuàng)建一個(gè)字典, 在其中存儲(chǔ)三條大河流及其流經(jīng)的國(guó)家。 其中一個(gè)鍵—值對(duì)可能是'nile': 'egypt' 。
6-6 調(diào)查 : 在6.3.1節(jié)編寫的程序favorite_languages.py中執(zhí)行以下操作。
![]() ![]() 6.4 嵌套有時(shí)候, 需要將一系列字典存儲(chǔ)在列表中, 或?qū)⒘斜碜鳛橹荡鎯?chǔ)在字典中, 這稱為嵌套 。 你可以在列表中嵌套字典、 在字典中嵌套列表甚至在字典中嵌套字典。 正如下面的示例將演示的, 嵌套是一項(xiàng)強(qiáng)大的功能。 6.4.1 字典列表字典alien_0 包含一個(gè)外星人的各種信息, 但無法存儲(chǔ)第二個(gè)外星人的信息, 更別說屏幕上全部外星人的信息了。 如何管理成群結(jié)隊(duì)的外星人呢? 一種辦法是創(chuàng)建一個(gè)外星人列表, 其中每個(gè)外星人都是一個(gè)字典, 包含有關(guān)該外星人的各種信息。 ![]() ![]() 更符合現(xiàn)實(shí)的情形是, 外星人不止三個(gè), 且每個(gè)外星人都是使用代碼自動(dòng)生成的。 在下面的示例中, 我們使用range() 生成了30個(gè)外星人: ![]() ![]() 6.4.2 在字典中存儲(chǔ)列表有時(shí)候, 需要將列表存儲(chǔ)在字典中, 而不是將字典存儲(chǔ)在列表中。 例如, 你如何描述顧客點(diǎn)的比薩呢? 如果使用列表, 只能存儲(chǔ)要添加的比薩配料; 但如果使用字典, 就不僅可在其中包含配料列表, 還可包含其他有關(guān)比薩的描述 ![]() ![]() 每當(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)來遍歷與被調(diào)查者相關(guān)聯(lián)的語(yǔ)言列表: ![]() ![]() 6.4.3 在字典中存儲(chǔ)字典可在字典中嵌套字典, 但這樣做時(shí), 代碼可能很快復(fù)雜起來。 例如, 如果有多個(gè)網(wǎng)站用戶, 每個(gè)都有獨(dú)特的用戶名, 可在字典中將用戶名作為鍵, 然后將每位用戶的信息存儲(chǔ)在一個(gè)字典中, 并將該字典作為與用戶名相關(guān)聯(lián)的值。 在下面的程序中, 對(duì)于每位用戶, 我們都存儲(chǔ)了其三項(xiàng)信息: 名、 姓和居住地; 為訪問這些信息, 我們遍歷所有的用戶名,并訪問與每個(gè)用戶名相關(guān)聯(lián)的信息字典: ![]() ![]() 動(dòng)手試一試6-7 人 : 在為完成練習(xí)6-1而編寫的程序中, 再創(chuàng)建兩個(gè)表示人的字典, 然后將這三個(gè)字典都存儲(chǔ)在一個(gè)名為people 的列表中。 遍歷這個(gè)列表, 將其中每個(gè)人的所有信息都打印出來。 ![]() ![]() 6-9 喜歡的地方 : 創(chuàng)建一個(gè)名為favorite_places 的字典。 在這個(gè)字典中, 將三個(gè)人的名字用作鍵; 對(duì)于其中的每個(gè)人, 都存儲(chǔ)他喜歡的1~3個(gè)地方。 遍歷這個(gè)字典, 并將其中每個(gè)人的名字及其喜歡的地方打印出來。 ![]() ![]() 6-11 城市 : 創(chuàng)建一個(gè)名為cities 的字典, 其中將三個(gè)城市名用作鍵; 對(duì)于每座城市, 都創(chuàng)建一個(gè)字典, 并在其中包含該城市所屬的國(guó)家、 人口約數(shù)以及一個(gè)有關(guān)該城市的事實(shí)。 在表示每座城市的字典中, 應(yīng)包含country 、 population 和fact 等鍵。 將每座城市的名字以及有關(guān)它們的信息都打印出來。 ![]() ![]() 6.5 小結(jié)在本章中, 你學(xué)習(xí)了: 如何定義字典, 以及如何使用存儲(chǔ)在字典中的信息; 如何訪問和修改字典中的元素, 以及如何遍歷字典中的所有信息; 如何遍歷字典中所有的鍵-值對(duì)、 所有的鍵和所有的值; 如何在列表中嵌套字典、 在字典中嵌套列表以及在字典中嵌套字典。 在下一章中, 將學(xué)習(xí)while 循環(huán)以及如何從用戶那里獲取輸入。 ![]() |
|