理解 Python 3 中的字典

介紹

字典是Python內建的映射類型。字典將映射到,這些鍵-值對提供了一種在Python中存儲數據的有用方式。

通常用於保存相關的數據,例如ID或用戶配置文件中包含的信息,字典用花括號構造在兩側{ }

信息:要跟隨本教程中的示例代碼,請在本地系統上運行python3命令以打開Python交互式外殼。然後,您可以將示例代碼添加到>>>提示之後,以便進行複製、粘貼或編輯。

A dictionary looks like this:

sammy = {'username': 'sammy-shark', 'online': True, 'followers': 987}

除了花括號之外,字典中還有冒號(:)。

冒號左邊的詞是鍵。 可以由任何不可變數據類型組成。上面字典中的鍵是:

  • 'username'
  • 'online'
  • 'followers'

上面示例中的每個鍵都是字符串值。

冒號右邊的詞是值。 可以由任何數據類型組成。上面字典中的值是:

  • 'sammy-shark'
  • True
  • 987

這些值中的每個都是字符串、布林值整數

讓我們打印出字典sammy:

print(sammy)
Output
{'username': 'sammy-shark', 'followers': 987, 'online': True}

查看輸出,鍵值對的順序可能已經變化。在Python 3.5及更早版本中,字典數據類型是無序的。但是,在Python 3.6及更高版本中,字典數據類型保持有序。無論字典是否有序,鍵值對都將保持不變,使我們能夠根據它們的關聯意義訪問數據。

先決條件

您應該已經安裝了Python 3並在您的計算機或服務器上設置了編程環境。如果您尚未設置編程環境,您可以參考適用於您的操作系統(Ubuntu、CentOS、Debian等)的本地編程環境或您的服務器上的編程環境的安裝和設置指南。

訪問字典元素

我們可以通過引用相關鍵來調用字典的值。

使用鍵訪問數據項

因為字典提供了用於存儲數據的鍵值對,它們可以是Python程序中的重要元素。

如果我們想要隔離Sammy的用戶名,我們可以通過調用sammy['username']來實現。讓我們打印出來:

print(sammy['username'])
Output
sammy-shark

字典的行為類似於數據庫,因為您不是通過調用整數來獲取特定索引值,而是將值分配給鍵並可以調用該鍵來獲取其相關值。

通過調用鍵'username',我們獲得該鍵的值,即'sammy-shark'

同樣,可以使用相同的格式調用sammy字典中的其餘值:

sammy['followers']
# 返回 987

sammy['online']
# 返回 True

通過利用字典的鍵值對,我們可以引用鍵來檢索值。

使用方法訪問元素

除了使用鍵訪問值之外,我們還可以使用一些內置方法來處理:

  • dict.keys() 獨立鍵
  • dict.values() 獨立值
  • dict.items() 返回一個列表格式的 (key, value) 元組對

要返回鍵,我們將使用 dict.keys() 方法。在我們的示例中,這將使用變量名稱並為 sammy.keys()。讓我們將其傳遞給 print() 方法並查看輸出:

print(sammy.keys())
Output
dict_keys(['followers', 'username', 'online'])

我們收到的輸出將鍵放置在 dict_keys 類的可迭代視圖對象中。然後將鍵以列表格式打印。

此方法可用於查詢多個字典。例如,我們可以查看兩個字典數據結構之間共享的常見鍵:

sammy = {'username': 'sammy-shark', 'online': True, 'followers': 987}
jesse = {'username': 'JOctopus', 'online': False, 'points': 723}

for common_key in sammy.keys() & jesse.keys():
    print(sammy[common_key], jesse[common_key])

字典 sammy 和字典 jesse 分別是用戶配置文件字典。

他們的配置文件具有不同的鍵,因為 Sammy 有一個帶有相關追隨者的社交配置文件,而 Jesse 則有一個帶有相關點數的遊戲配置文件。當我們運行此小程序時,我們可以找到它們共有的 2 個鍵是 usernameonline 狀態:

Output
sammy-shark JOctopus True False

我們肯定可以改進這個程序,使輸出更易讀,但這說明了dict.keys()可以用來檢查各種字典之間的共同之處或不同之處。對於大型字典來說,這尤其有用。

同樣地,我們可以使用dict.values()方法來查詢sammy字典中的值,這將被構造為sammy.values()。讓我們打印出來:

sammy = {'username': 'sammy-shark', 'online': True, 'followers': 987}

print(sammy.values())
Output
dict_values([True, 'sammy-shark', 987])

這兩種方法keys()values()都返回sammy字典中存在的鍵和值的未排序列表,分別帶有dict_keysdict_values的視圖對象。

print(sammy.items())
Output
dict_items([('online', True), ('username', 'sammy-shark'), ('followers', 987)])

如果我們對字典中的所有項目都感興趣,我們可以使用items()方法訪問它們:

返回的格式是由(key, value)元組對組成的列表,帶有dict_items的視圖對象。

for key, value in sammy.items():
    print(key, 'is the key for the value', value)
Output
online is the key for the value True followers is the key for the value 987 username is the key for the value sammy-shark

上面的for循環遍歷了sammy字典中的項目,並逐行打印出鍵和值,並提供了使其更易於人類理解的信息。

我們可以使用內置方法從字典數據結構中訪問項目、值和鍵。

修改字典

字典是一种可变数据结构,因此您可以修改它们。在本节中,我们将讨论如何添加和删除字典元素。

添加和更改字典元素

不使用方法或函数,您可以使用以下语法向字典添加键值对:

dict[key] = value

我们将通过向名为usernames的字典添加一个键值对来查看实际操作:

usernames = {'Sammy': 'sammy-shark', 'Jamie': 'mantisshrimp54'}

usernames['Drew'] = 'squidly'

print(usernames)
Output
{'Drew': 'squidly', 'Sammy': 'sammy-shark', 'Jamie': 'mantisshrimp54'}

现在我们看到字典已经更新为'Drew': 'squidly'键值对。由于字典可能是无序的,因此该对可能出现在字典输出的任何位置。如果我们在程序文件中稍后使用usernames字典,它将包含额外的键值对。

此外,此语法还可用于修改分配给键的值。在这种情况下,我们将引用现有键并将不同的值传递给它。

讓我們考慮一個字典drew,它是給定網絡上的一個用戶之一。我們會說,這個用戶今天的粉絲增加了,所以我們需要更新傳遞給'followers'鍵的整數值。我們將使用print()函數來檢查該字典是否已修改。

drew = {'username': 'squidly', 'online': True, 'followers': 305}

drew['followers'] = 342

print(drew)
Output
{'username': 'squidly', 'followers': 342, 'online': True}

在輸出中,我們看到粉絲的數量從整數值305跳躍到342

我們可以使用這種方法來向字典添加帶有用戶輸入的鍵-值對。讓我們編寫一個快速程序usernames.py,在命令行上運行,並允許來自用戶的輸入以添加更多名稱和相關的用戶名:

usernames.py
# 定義原始字典
usernames = {'Sammy': 'sammy-shark', 'Jamie': 'mantisshrimp54'}

# 設置while循環以迭代
while True:

    # 要求用戶輸入名稱
    print('Enter a name:')

    # 分配給名稱變量
    name = input()

    # 檢查名稱是否在字典中並打印反饋
    if name in usernames:
        print(usernames[name] + ' is the username of ' + name)

    # 如果名稱不在字典中...
    else:

        # 提供反饋        
        print('I don\'t have ' + name + '\'s username, what is it?')

        # 接收相關名稱的新用戶名
        username = input()

        # 將用戶名值分配給名稱鍵
        usernames[name] = username

        # 打印反饋,表明數據已更新
        print('Data updated.')

讓我們在命令行上運行該程序:

  1. python usernames.py

當我們運行程序時,我們會得到以下類似的輸出:

Output
Enter a name: Sammy sammy-shark is the username of Sammy Enter a name: Jesse I don't have Jesse's username, what is it? JOctopus Data updated. Enter a name:

當我們測試完程序後,可以按下CTRL + C來退出程序。您可以設置一個觸發器來退出程序(例如輸入字母q),並使用條件語句來改進代碼。

這顯示了您如何互動修改字典。對於這個特定的程序,一旦您使用CTRL + C退出程序,除非您實現了一種方式來處理讀寫文件,否則您將丟失所有數據。

我們還可以使用dict.update()方法添加和修改字典。這與列表中可用的append() 方法有所不同。

在下面的jesse字典中,讓我們添加鍵'followers'並給它一個整數值,使用jesse.update()。之後,讓我們print()更新後的字典。

jesse = {'username': 'JOctopus', 'online': False, 'points': 723}

jesse.update({'followers': 481})

print(jesse)
Output
{'followers': 481, 'username': 'JOctopus', 'points': 723, 'online': False}

從輸出中,我們可以看到我們成功將'followers': 481鍵值對添加到字典jesse中。

我們也可以使用dict.update()方法來修改現有的鍵值對,通過為特定鍵替換給定值。

讓我們將 Sammy 的在線狀態從 True 改為 Falsesammy 字典中:

sammy = {'username': 'sammy-shark', 'online': True, 'followers': 987}

sammy.update({'online': False})

print(sammy)
Output
{'username': 'sammy-shark', 'followers': 987, 'online': False}

這行 sammy.update({'online': False}) 引用現有鍵 'online',並將其布林值從 True 修改為 False。當我們調用 print() 函數列印字典時,我們可以看到更新在輸出中生效。

要向字典添加項目或修改值,我們可以使用 dict[key] = value 語法或方法 dict.update()

刪除字典元素

就像您可以向字典數據類型添加鍵值對並更改值一樣,您也可以刪除字典內的項目。

要從字典中刪除鍵值對,我們將使用以下語法:

del dict[key]

讓我們以代表其中一位用戶的 jesse 字典為例。我們會說 Jesse 不再使用在線平台玩遊戲,所以我們會刪除與 'points' 鍵關聯的項目。然後,我們將列印該字典以確認項目已被刪除:

jesse = {'username': 'JOctopus', 'online': False, 'points': 723, 'followers': 481}

del jesse['points']

print(jesse)
Output
{'online': False, 'username': 'JOctopus', 'followers': 481}

這行 del jesse['points']jesse 字典中刪除了鍵值對 'points': 723

如果我們想清空字典中的所有值,我們可以使用dict.clear()方法來實現。這將保留給定的字典,以防我們稍後在程序中需要使用它,但它將不再包含任何項目。

讓我們刪除jesse字典中的所有項目:

jesse = {'username': 'JOctopus', 'online': False, 'points': 723, 'followers': 481}

jesse.clear()

print(jesse)
Output
{}

輸出顯示我們現在有一個空字典,不包含任何鍵值對。

如果我們不再需要特定的字典,我們可以使用del完全刪除它:

del jesse

print(jesse)

在刪除jesse字典後運行print()時,我們將收到以下錯誤:

Output
... NameError: name 'jesse' is not defined

因為字典是可變的數據類型,所以可以添加、修改和刪除和清除項目。

結論

本教程介紹了Python中的字典數據結構。字典由鍵值對組成,並提供了一種存儲數據的方式,而不依賴於索引。這使我們可以根據數據的含義和與其他數據類型的關係檢索值。

從這裡,您可以在我們的“理解數據類型”教程中學習更多關於其他數據類型的知識。

你可以在程式設計專案中看到字典資料型態的使用,例如使用 Scrapy 進行網頁抓取

Source:
https://www.digitalocean.com/community/tutorials/understanding-dictionaries-in-python-3