Python 字典簡介
Python 中的變數可以儲存各種資料類型。 之前,您已了解您可儲存字串和數字:
name = 'Earth'
moons = 1
雖然此方法適用於較小的資料量,但是當您使用相關資料時,可能會變得日益複雜。 設想您要儲存有關地球的衛星和木星的衛星的資訊。
earth_name = 'Earth'
earth_moons = 1
jupiter_name = 'Jupiter'
jupiter_moons = 79
請注意,我們如何使用不同的前置詞來複製變數。 這種重複可能會變得難以處理。 因為您會經常發現自己使用相關的資料集,例如不同城市中不同月份的平均雨量,所以將這些變數儲存為個別值並非可行的選項。 相反地,您可以使用 Python 字典。
Python 字典可讓您使用相關的資料集。 字典是索引鍵/值組的集合。 將此想像成容器內的變數群組,其中索引鍵是變數的名稱,而值則是儲存在其中的值。
建立字典
Python 會使用大括弧 ({ }
) 和冒號 (:
) 來表示字典。 您可以建立空的字典,稍後新增值,或在建立時予以填入。 每個索引鍵/值都會以冒號分隔,而每個索引鍵的名稱都會以字串常值的形式包含在引號中。 因為索引鍵是字串常值,所以您可使用任何適當的名稱來描述值。
讓我們建立字典來儲存地球這個行星的名稱,以及地球擁有的衛星數目:
planet = {
'name': 'Earth',
'moons': 1
}
您有兩個索引鍵:'name'
和 'moons'
。 各個索引鍵的行為都與變數大致相同:具有唯一的名稱,而且會儲存一個值。 不過,它們包含在名為 planet
的單一較大變數內。
如同一般變數,您必須確定您使用的是正確的資料類型。 在上述範例中 1
的 moons
值中,您並未在數字周圍包含引號,因為您想要使用整數。 如果您已使用 '1'
,Python 會將此變數視為字串,這會影響您執行計算的能力。
不同於一般變數,索引鍵名稱不需要遵循 Python 的標準命名規則。 在程式碼中使用金鑰名稱,可以更具描述性。
讀取字典值
您可以讀取字典內的值。 字典物件有一個 get
方法,您可使用其索引鍵來存取值。 如果您想要列印 name
,可使用下列程式碼:
print(planet.get('name'))
Earth
如您所料,存取字典中的值是常見的作業。 幸運的是,有一個捷徑。 您也可以將索引鍵傳遞至方括弧標記法 ([ ]
)。 此方法使用比 get
還少的程式碼,而大部分的程式設計人員都會改用此語法。 您可使用下列程式碼來重寫上述範例:
# planet['name'] is identical to using planet.get('name')
print(planet['name'])
Earth
雖然 get
和方括弧 ([ ]
) 的行為通常與擷取專案相同,但有一個主要差異。 如果索引鍵無法使用,則 get
會傳回 None
,而 [ ]
會引發 KeyError
。
wibble = planet.get('wibble') # Returns None
wibble = planet['wibble'] # Throws KeyError
修改字典值
您也可使用 update
方法來修改字典物件內的值。 這個方法接受字典作為參數,並使用您提供的新值來更新任何現有的值。 如果您想要變更 planet
字典的 name
,可使用下列程式碼,例如:
planet.update({'name': 'Makemake'})
# No output: name is now set to Makemake.
與使用方括弧 ([ ]
) 捷徑讀取值類似,您可使用相同的捷徑來修改值。 語法的主要差異在於,您使用 =
(有時稱為指派運算子) 來提供新的值。 若要重寫上述範例以變更名稱,您可使用下列程式碼:
planet['name'] = 'Makemake'
# No output: name is now set to Makemake.
使用 update
的主要優點是能夠在一個作業中修改多個值。 接下來的兩個範例邏輯相同,但語法不同。 您可以隨意使用您覺得最合適的語法。 大部分開發人員選擇方括弧來更新個別值。
下列範例會對 planet
變數進行相同的編輯,並更新名稱和衛星。 請注意,使用 update
,您會對此函式進行單一呼叫,而使用方括弧則涉及兩個呼叫。
使用更新:
planet.update({
'name': 'Jupiter',
'moons': 79
})
使用方括弧:
planet['name'] = 'Jupiter'
planet['moons'] = 79
新增和移除索引鍵
初始化字典時,您不需要建立所有索引鍵。 事實上,您不需要建立任何索引鍵! 每當您想要建立新的索引鍵時,您會如同現有的索引鍵一樣指派它。
假設您想要更新 planet
以包含軌道週期 (天數):
planet['orbital period'] = 4333
# planet dictionary now contains: {
# name: 'jupiter'
# moons: 79
# orbital period: 4333
# }
重要
索引鍵名稱 (就像 Python 中的其他所有項目),會區分大小寫。 因此,'name'
和 'Name'
會在 Python 字典中視為兩個不同的索引鍵。
若要移除索引鍵,請使用 pop
。 pop
會傳回值,並從字典中移除索引鍵。 若要移除 orbital period
,您可以使用下列程式碼:
planet.pop('orbital period')
# planet dictionary now contains: {
# name: 'jupiter'
# moons: 79
# }
複雜的資料類型
字典能夠儲存任何類型的值,包括其他字典。 這可讓您視需要建立複雜資料的模型。 假設需要儲存 planet
的直徑,可環繞其赤道或兩極進行測量。 您可在 planet
內部建立另一個字典以儲存此資訊:
# Add address
planet['diameter (km)'] = {
'polar': 133709,
'equatorial': 142984
}
# planet dictionary now contains: {
# name: 'Jupiter'
# moons: 79
# diameter (km): {
# polar: 133709
# equatorial: 142984
# }
# }
若要擷取巢狀字典中的值,您可將方括弧或對 get
的呼叫鏈結在一起。
print(f'{planet["name"]} polar diameter: {planet["diameter (km)"]["polar"]}')
Jupiter polar diameter: 133709