您當前的位置:首頁 > 收藏

第 6 章字典

作者:由 LOLI 發表于 收藏時間:2022-07-01

在本章中,你將學習能夠將相關資訊關聯起來的Python字典。你將學習如何訪問和修改字典中的資訊。鑑於字典可儲存的資訊量幾乎不受限制,因此我們會演示如何遍 歷字典中的資料。另外,你還將學習儲存字典的列表、儲存列表的字典和儲存字典的字典。

理解字典後,你就能夠更準確地為各種真實物體建模。你可以建立一個表示人的字典,然後想在其中儲存多少資訊就儲存多少資訊:姓名、年齡、地址、職業以及要描述的任何方面。你還能夠儲存任意兩種相關的資訊,如一系列單詞及其含義,一系列人名及其喜歡的數字,以及一系列山脈及其海拔等。

6.1 一個簡單的字典

來看一個遊戲,其中包含一些外星人,這些外星人的顏色和點數各不相同。下面是一個簡單的字典,儲存了有關特定外星人的資訊:

字典alien_0 儲存了外星人的顏色和點數。使用兩條print 語句來訪問並列印這些資訊,如下所示:

6.1 一個簡單的字典

第 6 章字典

與大多數程式設計概念一樣,要熟練使用字典,也需要一段時間的練習。使用字典一段時間後,你就會明白為何它們能夠高效地模擬現實世界中的情形。

alien.py

在Python中,

alien.py

是一系列

6.2 使用字典

6.2 使用字典

字典

。每個

都與一個值相關聯,你可以使用鍵來訪問與之相關聯的值。與鍵相關聯的值可以是數字、字串、列表乃至字典。事實上,可將任何Python物件用作字典中的值。

在Python中,字典用放在花括號{} 中的一系列鍵—值對錶示,如前面的示例所示:

第 6 章字典

值對

對是兩個相關聯的值。指定鍵時,Python將返回與之相關聯的值。鍵和值之間用冒號分隔,而鍵—值對之間用逗號分隔。在字典中,你想儲存多少個鍵—值對都可以。最簡單的字典只有一個鍵—值對,如下述修改後的字典alien_0 所示:

alien_0 = {‘color’: ‘green’}

這個字典只儲存了一項有關alien_0 的資訊,具體地說是這個外星人的顏色。在這個字典中,字串‘color’ 是一個鍵,與之相關聯的值為‘green’ 。

要獲取與鍵相關聯的值,可依次指定字典名和放在方括號內的鍵,如下所示:

第 6 章字典

這將返回字典alien_0 中與鍵‘color’ 相關聯的值

字典中可包含任意數量的鍵—值對。例如,下面是最初的字典alien_0 ,其中包含兩個鍵—值對:

alien_0 = {‘color’: ‘green’, ‘points’: 5}

上述程式碼首先定義了一個字典,然後從這個字典中獲取與鍵‘points’ 相關聯的值(見❶),並將這個值儲存在變數new_points 中。接下來,將這個整數轉換為字串,並列印一條訊息,指出玩家獲得了多少個點(見❷):

You just earned 5 points!

如果你在有外星人被射殺時都執行這段程式碼,就會獲取該外星人的點數。

字典是一種動態結構,可隨時在其中新增鍵—值對。要新增鍵—值對,可依次指定字典名、用方括號括起的鍵和相關聯的值。

下面在字典alien_0 中新增兩項資訊:外星人的 x 座標和 y 座標,讓我們能夠在螢幕的特定位置顯示該外星人。我們將這個外星人放在螢幕左邊緣,且離螢幕上邊緣25畫素的地方。由於螢幕座標系的原點通常為左上角,因此要將該外星人放在螢幕左邊緣,可將 x 座標設定為0;要將該外星人放在離螢幕頂部25畫素的地方,可將 y 座標設定為25,如下所示:

第 6 章字典

我們首先定義了前面一直在使用的字典,然後列印這個字典,以顯示其資訊快照。在❶處,我們在這個字典中新增了一個鍵—值對,其中的鍵為‘x_position’ ,而值為0 。在

❷處,我們重複這樣的操作,但使用的鍵為‘y_position’ 。列印修改後的字典時,將看到這兩個新增的鍵—值對。

這個字典的最終版本包含四個鍵—值對,其中原來的兩個指定外星人的顏色和點數,而新增的兩個指定位置。注意,鍵—值對的排列順序與新增順序不同。Python不關心鍵—值對 的新增順序,而只關心鍵和值之間的關聯關係。

有時候,在空字典中新增鍵—值對是為了方便,而有時候必須這樣做。為此,可先使用一對空的花括號定義一個字典,再分行新增各個鍵—值對。例如,下例演示瞭如何以這種方式建立字典alien_0 :

第 6 章字典

這裡首先定義了空字典alien_0 ,再在其中新增顏色和點數,得到前述示例一直在使用的字典:

使用字典來儲存使用者提供的資料或在編寫能自動生成大量鍵—值對的程式碼時,通常都需要先定義一個空字典。

6.2.1 訪問字典中的值

要修改字典中的值,可依次指定字典名、用方括號括起的鍵以及與該鍵相關聯的新值。例如,假設隨著遊戲的進行,需要將一個外星人從綠色改為黃色:

第 6 章字典

我們首先定義了一個表示外星人alien_0 的字典,其中只包含這個外星人的顏色。接下來,我們將與鍵‘color’ 相關聯的值改為‘yellow’ 。輸出表明,這個外星人確實從綠色變成了黃色。

來看一個更有趣的例子:對一個能夠以不同速度移動的外星人的位置進行跟蹤。為此,我們將儲存該外星人的當前速度,並據此確定該外星人將向右移動多遠:

第 6 章字典

我們首先定義了一個外星人,其中包含初始的x 座標和y 座標,還有速度‘medium’ 。出於簡化考慮,我們省略了顏色和點數,但即便包含這些鍵-值對,這個示例的工作原理也不會有任何變化。我們還列印了x_position 的初始值,旨在讓使用者知道這個外星人向右移動了多遠。

在❶處,使用了一個if-elif-else 結構來確定外星人應向右移動多遠,並將這個值儲存在變數x_increment 中。如果外星人的速度為‘slow’ ,它將向右移動一個單位;如果速度為‘medium’ ,將向右移動兩個單位;如果為‘fast’ ,將向右移動三個單位。確定移動量後,將其與x_position 的當前值相加(見❷),再將結果關聯到字典中的鍵x_position 。

由於這是一個速度中等的外星人,因此其位置將向右移動兩個單位

這種技術很棒:透過修改外星人字典中的值,可改變外星人的行為。例如,要將這個速度中等的外星人變成速度很快的外星人,可新增如下程式碼行:

alien_0[‘speed’] = fast

這樣,再次執行這些程式碼時,其中的if-elif-else 結構將把一個更大的值賦給變數x_increment 。

6.2.1 訪問字典中的值

對於字典中不再需要的資訊,可使用del 語句將相應的鍵—值對徹底刪除。使用del 語句時,必須指定字典名和要刪除的鍵。例如,下面的程式碼從字典alien_0 中刪除鍵‘points’ 及其值:

第 6 章字典

❶處的程式碼行讓Python將鍵‘points’ 從字典alien_0 中刪除,同時刪除與這個鍵相關聯的值。輸出表明,鍵‘points’ 及其值5 已從字典中刪除,但其他鍵—值對未受影響。

6.2.2 新增鍵——值對

刪除的鍵—值對永遠消失了。

6.2.2 新增鍵——值對

在前面的示例中,字典儲存的是一個物件(遊戲中的一個外星人)的多種資訊,但你也可以使用字典來儲存眾多物件的同一種資訊。例如,假設你要調查很多人,詢問他們最喜歡的程式語言,可使用一個字典來儲存這種簡單調查的結果,如下所示:

第 6 章字典

正如你看到的,我們將一個較大的字典放在了多行中。其中每個鍵都是一個被調查者的名字,而每個值都是被調查者喜歡的語言。確定需要使用多行來定義字典時,在輸入左花括號後按回車鍵,再在下一行縮排四個空格,指定第一個鍵—值對,並在它後面加上一個逗號。此後你再次按回車鍵時,文字編輯器將自動縮排後續鍵—值對,且縮排量與第一個鍵—值對相同。

定義好字典後,在最後一個鍵—值對的下一行新增一個右花括號,並縮排四個空格,使其與字典中的鍵對齊。另外一種不錯的做法是在最後一個鍵—值對後面也加上逗號,為以後在下一行新增鍵—值對做好準備。

6.2.3 先建立一個新字典

對於較長的列表和字典,大多數編輯器都有以類似方式設定其格式的功能。對於較長的字典,還有其他一些可行的格式設定方式,因此在你的編輯器或其他原始碼中,你可能會看到稍微不同的格式設定方式。

給定被調查者的名字,可使用這個字典輕鬆地獲悉他喜歡的語言:

6.2.3 先建立一個新字典

第 6 章字典

為獲悉Sarah 喜歡的語言,我們使用如下程式碼:

在print 語句中,我們使用了這種語法(見❷);輸出指出了Sarah喜歡的語言。

這個示例還演示瞭如何將較長的print 語句分成多行。單詞print 比大多數字典名都短,因此讓輸出的第一部分緊跟在左括號後面是合理的(見❶)。請選擇在合適的地方拆分要列印的內容,並在第一行末尾(見❷)加上一個拼接運算子(+ )。按回車鍵進入print 語句的後續各行,並使用Tab鍵將它們對齊並縮排一級。指定要列印的所有內容 後,在print 語句的最後一行末尾加上右括號(見❸)。

6.2.4 修改字典中的值

一個Python字典可能只包含幾個鍵—值對,也可能包含數百萬個鍵—值對。鑑於字典可能包含大量的資料,Python支援對字典遍歷。字典可用於以各種方式儲存資訊,因此有多種 遍歷字典的方式:可遍歷字典的所有鍵—值對、鍵或值。

6.2.4 修改字典中的值

探索各種遍歷方法前,先來看一個新字典,它用於儲存有關網站使用者的資訊。下面的字典儲存一名使用者的使用者名稱、名和姓:

第 6 章字典

利用本章前面介紹過的知識,可訪問user_0 的任何一項資訊,但如果要獲悉該使用者字典中的所有資訊,該怎麼辦呢?可以使用一個for 迴圈來遍歷這個字典:

6.2.5 刪除鍵-值對

第 6 章字典

如❶所示,要編寫用於遍歷字典的for 迴圈,可宣告兩個變數,用於儲存鍵—值對中的鍵和值。對於這兩個變數,可使用任何名稱。下面的程式碼使用了簡單的變數名,這完全可行:

for k, v in user_0。items()

for 語句的第二部分包含字典名和方法items() (見❶),它返回一個鍵—值對列表。接下來,for 迴圈依次將每個鍵—值對儲存到指定的兩個變數中。在前面的示例中,我們使用這兩個變數來列印每個鍵(見❷)及其相關聯的值(見❸)。第一條print 語句中的“\n” 確保在輸出每個鍵—值對前都插入一個空行:

注意,即便遍歷字典時,鍵—值對的返回順序也與儲存順序不同。Python不關心鍵—值對的儲存順序,而只跟蹤鍵和值之間的關聯關係。

在6。2。6節的示例favorite_languages。py中,字典儲存的是不同人的同一種資訊;對於類似這樣的字典,遍歷所有的鍵—值對很合適。如果遍歷字典favorite_languages ,將得到其中每個人的姓名和喜歡的程式語言。由於其中的鍵都是人名,而值都是語言,因此我們在迴圈中使用變數name 和language ,而不是key 和value ,這讓人更容易明白迴圈的作用:

6.2.5 刪除鍵-值對

第 6 章字典

❶處的程式碼讓Python遍歷字典中的每個鍵—值對,並將鍵儲存在變數name 中,而將值儲存在變數language 中。這些描述性名稱能夠讓人非常輕鬆地明白print 語句(見❷)是做什麼的。僅使用幾行程式碼,我們就將全部調查結果顯示出來。

即便字典儲存的是上千乃至上百萬人的調查結果,這種迴圈也管用。

注意

在不需要使用字典中的值時,方法keys() 很有用。下面來遍歷字典favorite_languages ,並將每個被調查者的名字都打印出來:

第 6 章字典

❶處的程式碼行讓Python提取字典favorite_languages 中的所有鍵,並依次將它們儲存到變數name 中。輸出列出了每個被調查者的名字:

遍歷字典時,會預設遍歷所有的鍵,因此,如果將上述程式碼中的for name in favorite_languages。keys(): 替換為for name in favorite_languages: ,輸出將不變。

如果顯式地使用方法keys() 可讓程式碼更容易理解,你可以選擇這樣做,但如果你願意,也可省略它。

在這種迴圈中,可使用當前鍵來訪問與之相關聯的值。下面來列印兩條訊息,指出兩位朋友喜歡的語言。我們像前面一樣遍歷字典中的名字,但在名字為指定朋友的名字時,列印一條訊息,指出其喜歡的語言:

第 6 章字典

在❶處,我們建立了一個列表,其中包含我們要透過列印訊息,指出其喜歡的語言的朋友。在迴圈中,我們列印每個人的名字,並檢查當前的名字是否在列表friends 中(見

❷)。如果在列表中,就列印一句特殊的問候語,其中包含這位朋友喜歡的語言。為訪問喜歡的語言,我們使用了字典名,並將變數name 的當前值作為鍵(見❸)。每個人的名字都會被列印,但只對朋友列印特殊訊息:

你還可以使用keys() 確定某個人是否接受了調查。下面的程式碼確定Erin是否接受了調查:

第 6 章字典

方法keys() 並非只能用於遍歷;實際上,它返回一個列表,其中包含字典中的所有鍵,因此❶處的程式碼行只是核實‘erin’ 是否包含在這個列表中。由於她並不包含在這個列表中,因此列印一條訊息,邀請她參加調查:

6.2.6 由類似物件組成的字典

字典總是明確地記錄鍵和值之間的關聯關係,但獲取字典的元素時,獲取順序是不可預測的。這不是問題,因為通常你想要的只是獲取與鍵相關聯的正確的值。要以特定的順序返回元素,一種辦法是在for 迴圈中對返回的鍵進行排序。為此,可使用函式sorted() 來獲得按特定順序排列的鍵列表的副本:

第 6 章字典

6.2.6 由類似物件組成的字典

如果你感興趣的主要是字典包含的值,可使用方法values() ,它返回一個值列表,而不包含任何鍵。例如,如果我們想獲得一個這樣的列表,即其中只包含被調查者選擇的各種語言,而不包含被調查者的名字,可以這樣做:

第 6 章字典

這條for 語句提取字典中的每個值,並將它們依次儲存到變數language 中。透過列印這些值,就獲得了一個列表,其中包含被調查者選擇的各種語言。

這種做法提取字典中所有的值,而沒有考慮是否重複。涉及的值很少時,這也許不是問題,但如果被調查者很多,最終的列表可能包含大量的重複項。為剔除重複項,可使用集合(set)。

注意

類似於列表,但每個元素都必須是獨一無二的:

第 6 章字典

透過對包含重複元素的列表呼叫set() ,可讓Python找出列表中獨一無二的元素,並使用這些元素來建立一個集合。在❶處,我們使用了set() 來提取favorite_languages。values() 中不同的語言。

結果是一個不重複的列表,其中列出了被調查者提及的所有語言。

隨著你更深入地學習Python,經常會發現它內建的功能可幫助你以希望的方式處理資料。

favorite_languages.py

有時候,需要將一系列字典儲存在列表中,或將列表作為值儲存在字典中,這稱為

favorite_languages.py

。你可以在列表中巢狀字典、在字典中巢狀列表甚至在字典中巢狀字典。正如下面的示例將演示的,巢狀是一項強大的功能。

6.3 遍歷字典

字典alien_0 包含一個外星人的各種資訊,但無法儲存第二個外星人的資訊,更別說螢幕上全部外星人的資訊了。如何管理成群結隊的外星人呢?一種辦法是建立一個外星人列表,其中每個外星人都是一個字典,包含有關該外星人的各種資訊。例如,下面的程式碼建立一個包含三個外星人的列表:

6.3 遍歷字典

第 6 章字典

我們首先建立了三個字典,其中每個字典都表示一個外星人。在❶處,我們將這些字典都放到一個名為aliens 的列表中。最後,我們遍歷這個列表,並將每個外星人都打印出來。

更符合現實的情形是,外星人不止三個,且每個外星人都是使用程式碼自動生成的。在下面的示例中,我們使用range() 生成了30個外星人:

第 6 章字典

第 6 章字典

在這個示例中,首先建立了一個空列表,用於儲存接下來將建立的所有外星人。在❶處,range() 返回一系列數字,其唯一的用途是告訴Python我們要重複這個迴圈多少次。每次執行這個迴圈時,都建立一個外星人(見❷),並將其附加到列表aliens 末尾(見❸)。在❹處,使用一個切片來列印前五個外星人;在❺處,列印列表的長度,以證明確實建立了30個外星人。

這些外星人都具有相同的特徵,但在Python看來,每個外星人都是獨立的,這讓我們能夠獨立地修改每個外星人。

在什麼情況下需要處理成群結隊的外星人呢?想象一下,可能隨著遊戲的進行,有些外星人會變色且移動速度會加快。必要時,我們可以使用for 迴圈和if 語句來修改某些外星人的顏色。例如,要將前三個外星人修改為黃色的、速度為中等且值10個點,可以這樣做:

第 6 章字典

鑑於我們要修改前三個外星人,需要遍歷一個只包含這些外星人的切片。當前,所有外星人都是綠色的,但情況並非總是如此,因此我們編寫了一條if 語句來確保只修改綠色外星人。如果外星人是綠色的,我們就將其顏色改為‘yellow’ ,將其速度改為‘medium’ ,並將其點數改為10 ,如下面的輸出所示。

你可以進一步擴充套件這個迴圈,在其中新增一個elif 程式碼塊,將黃色外星人改為移動速度快且值15個點的紅色外星人,如下所示(這裡只列出了迴圈,而沒有列出整個程式):

經常需要在列表中包含大量的字典,而其中每個字典都包含特定物件的眾多資訊。例如,你可能需要為網站的每個使用者建立一個字典(就像6。3。1節的user。py中那樣),並將這些 字典儲存在一個名為users 的列表中。在這個列表中,所有字典的結構都相同,因此你可以遍歷這個列表,並以相同的方式處理其中的每個字典。

6.3.1 遍歷所有的鍵-值對

有時候,需要將列表儲存在字典中,而不是將字典儲存在列表中。例如,你如何描述顧客點的比薩呢?如果使用列表,只能儲存要新增的比薩配料;但如果使用字典,就不僅可在其中包含配料列表,還可包含其他有關比薩的描述。

在下面的示例中,儲存了比薩的兩方面資訊:外皮型別和配料列表。其中的配料列表是一個與鍵‘toppings’ 相關聯的值。要訪問該列表,我們使用字典名和鍵‘toppings’

,就像訪問字典中的其他值一樣。這將返回一個配料列表,而不是單個值:

6.3.1 遍歷所有的鍵-值對

第 6 章字典

我們首先建立了一個字典,其中儲存了有關顧客所點比薩的資訊(見❶)。在這個字典中,一個鍵是‘crust’ ,與之相關聯的值是字串‘thick’ ;下一個鍵是‘toppings’

,與之相關聯的值是一個列表,其中儲存了顧客要求新增的所有配料。製作前我們概述了顧客所點的比薩(見❷)。為列印配料,我們編寫了一個for 迴圈(見❸)。為訪問配料列表,我們使用了鍵‘toppings’ ,這樣Python將從字典中提取配料列表。

下面的輸出概述了要製作的比薩。

每當需要在字典中將一個鍵關聯到多個值時,都可以在字典中巢狀一個列表。在本章前面有關喜歡的程式語言的示例中,如果將每個人的回答都儲存在一個列表中,被調查者就可選擇多種喜歡的語言。在這種情況下,當我們遍歷字典時,與每個被調查者相關聯的都是一個語言列表,而不是一種語言;因此,在遍歷該字典的for 迴圈中,我們需要再使用一個for 迴圈來遍歷與被調查者相關聯的語言列表:

user.py

第 6 章字典

正如你看到的,現在與每個名字相關聯的值都是一個列表(見❶)。請注意,有些人喜歡的語言只有一種,而有些人有多種。遍歷字典時(見❷),我們使用了變數languages來依次儲存字典中的每個值,因為我們知道這些值都是列表。在遍歷字典的主迴圈中,我們又使用了一個for 迴圈來遍歷每個人喜歡的語言列表(見❸)。現在,每個人想列出多少種喜歡的語言都可以。

為進一步改進這個程式,可在遍歷字典的for 迴圈開頭新增一條if 語句,透過檢視len(languages) 的值來確定當前的被調查者喜歡的語言是否有多種。如果他喜歡的語言有多種,就像以前一樣顯示輸出;如果只有一種,就相應修改輸出的措辭,如顯示Sarah‘s favorite language is C 。

user.py

列表和字典的巢狀層級不應太多。如果巢狀層級比前面的示例多得多,很可能有更簡單的解決問題的方案。

favorite_languages.py

可在字典中巢狀字典,但這樣做時,程式碼可能很快複雜起來。例如,如果有多個網站使用者,每個都有獨特的使用者名稱,可在字典中將使用者名稱作為鍵,然後將每位使用者的資訊儲存在一個字典中,並將該字典作為與使用者名稱相關聯的值。在下面的程式中,對於每位使用者,我們都儲存了其三項資訊:名、姓和居住地;為訪問這些資訊,我們遍歷所有的使用者名稱, 並訪問與每個使用者名稱相關聯的資訊字典:

favorite_languages.py

第 6 章字典

我們首先定義了一個名為users 的字典,其中包含兩個鍵:使用者名稱’aeinstein‘ 和’mcurie‘ ;與每個鍵相關聯的值都是一個字典,其中包含使用者的名、姓和居住地。在❶處,我們遍歷字典users ,讓Python依次將每個鍵儲存在變數username 中,並依次將與當前鍵相關聯的字典儲存在變數user_info 中。在主迴圈內部的❷處,我們將使用者名稱打印出來。在❸處,我們開始訪問內部的字典。變數user_info 包含使用者資訊字典,而該字典包含三個鍵:’first‘ 、’last‘ 和’location‘ ;對於每位使用者,我們都使用這些鍵來生成整潔的姓名和居住地,然後列印有關使用者的簡要資訊(見❹)。

請注意,表示每位使用者的字典的結構都相同,雖然Python並沒有這樣的要求,但這使得巢狀的字典處理起來更容易。倘若表示每位使用者的字典都包含不同的鍵,for 迴圈內部的程式碼將更復雜。

6.3.2 遍歷字典中的所有鍵

在本章中,你學習了:如何定義字典,以及如何使用儲存在字典中的資訊;如何訪問和修改字典中的元素,以及如何遍歷字典中的所有資訊;如何遍歷字典中所有的鍵-值對、所有的鍵和所有的值;如何在列表中巢狀字典、在字典中巢狀列表以及在字典中巢狀字典。

在下一章中,你將學習while 迴圈以及如何從使用者那裡獲取輸入。這是激動人心的一章,讓你知道如何將程式變成互動性的——能夠對使用者輸入作出響應。

標簽: 字典  外星人  列表  儲存  遍歷