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 的單一較大變數內。

如同一般變數,您必須確定您使用的是正確的資料類型。 在上述範例中 1moons 值中,您並未在數字周圍包含引號,因為您想要使用整數。 如果您已使用 '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 字典中視為兩個不同的索引鍵。

若要移除索引鍵,請使用 poppop 會傳回值,並從字典中移除索引鍵。 若要移除 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