如何在 Python 中反轉一個字典

Rayven Esplanada 2023年1月30日
  1. 在 Python 中使用 items() 來反轉一個字典
  2. 在 Python 中使用 collections.defaultdict() 反轉一個字典
如何在 Python 中反轉一個字典

本文演示了在 Python 中反轉字典的不同方法。

反轉一個字典與反轉一個列表不同,它的意思是反轉或切換字典的鍵和值元素,本質上是為了開發者可能使用它的任何目的而交換它們。

在 Python 中使用 items() 來反轉一個字典

Python 字典有一個內建函式叫做 items(),它返回一個可迭代的物件,以元組的形式顯示字典的鍵值對。

例如,宣告一個隨機類別的字典,並使用 items() 將其列印出來。

dct = {
    "Animal": "Dog",
    "Fruit": "Pear",
    "Vegetable": "Cabbage",
    "Tree": "Maple",
    "Flower": "Daisy",
}

print(dct.items())

輸出:

dict_items([('Animal', 'Dog'), ('Fruit', 'Pear'), ('Vegetable', 'Cabbage'), ('Tree', 'Maple'), ('Flower', 'Daisy')])

使用 items() 列印字典將輸出一個可迭代的元組值列表,我們可以使用 for 迴圈來對字典進行操作。

通過遍歷 items() 的結果並切換鍵和值來反轉鍵值對。

dct = {v: k for k, v in dct.items()}
print(dct)

for 迴圈中的 kv 分別代表鍵和值。v: k 是每次迭代中鍵和值的佔位符,不過我們將之前的值 v 設為新鍵,將之前的鍵 k 設為新值。

輸出:

{'Dog': 'Animal', 'Pear': 'Fruit', 'Cabbage': 'Vegetable', 'Maple': 'Tree', 'Daisy': 'Flower'}

現在,鍵和值元素在輸出中反轉了。

反轉字典中的同值鍵值

另一個反轉字典的例子是,如果有多個鍵或值具有相同的值。這是較有可能倒置字典的場景。

例如,一個人們最喜歡的動物的字典。

favAnimal = {
    "John": "Dog",
    "Jane": "Cat",
    "Jerome": "Lion",
    "Jenny": "Dog",
    "Jared": "Giraffe",
    "James": "Dog",
}

如果用上面的程式碼對字典進行反轉,輸出的結果就不會像你想象的那樣。

favAnimal = {v: k for k, v in favAnimal.items()}
print(favAnimal)

輸出:

{'Dog': 'James', 'Cat': 'Jane', 'Lion': 'Jerome', 'Giraffe': 'Jared'}

這裡,原始字典中少了 2 個元素,因為每當一個鍵或一個值在迴圈中重複時,現有的記錄就會被覆蓋。

字典中包含了 3 個具有 Dog 值的人,但只有 James 被複制,因為這是最後一條具有 Dog 值的記錄,並且已經覆蓋了其他 2 個字典項。

為了解決這個問題,我們必須將值儲存在一個列表中,這樣它們就會被分配到一個單一的鍵。

完整的示例程式碼。

favAnimal = {
    "John": "Dog",
    "Jane": "Cat",
    "Jerome": "Lion",
    "Jenny": "Dog",
    "Jared": "Giraffe",
    "James": "Dog",
}

favAnimal = {v: k for k, v in favAnimal.items()}

print(favAnimal)

在 Python 中使用 collections.defaultdict() 反轉一個字典

模組 collections 有一個函式 defaultdict(),它可以在 Python 中操作字典中的值。

defaultdict() 主要用於建立不存在的鍵的預設值。如果你訪問一個不存在的鍵,它可以為它宣告一個預設值,即使它不存在。

這個函式對我們的情況很有用,因為我們要例項化一個新的字典,其值是列表資料型別的。

使用同樣的例子 favAnimal,反轉字典並將值轉換為列表。

首先,使用 defaultdict() 初始化新字典。

from collections import defaultdict

favAnimal_inverted = defaultdict(list)

接下來,使用列表推導式進行反轉,並將反轉後的值儲存到新的字典中。

{favAnimal_inverted[v].append(k) for k, v in favAnimal.items()}

最後,因為 defaultdict() 建立了一種字典的子類,所以通過將其封裝在 dict() 中重新轉換為基礎字典型別。

result = dict(favAnimal_inverted)
print(result)

輸出:

{'Dog': ['John', 'Jenny', 'James'], 'Cat': ['Jane'], 'Lion': ['Jerome'], 'Giraffe': ['Jared']}

John, Jenny, 和 James 現在在同一個列表中,鍵為 Dog,而不是其他元素被最後一個以 Dog 為值的元素所覆蓋。

完整的示例程式碼。

from collections import defaultdict

favAnimal_inverted = defaultdict(list)
result = dict(favAnimal_inverted)
print(result)

總而言之,使用 items() 在字典上迴圈並反轉鍵和值。如果碰巧你的資料集很可能有重複,那麼一定要使用 defaultdict() 將值轉換為列表,並以字典的值會追加到列表中而不是替換現有值的方式進行操作。

Rayven Esplanada avatar Rayven Esplanada avatar

Skilled in Python, Java, Spring Boot, AngularJS, and Agile Methodologies. Strong engineering professional with a passion for development and always seeking opportunities for personal and career growth. A Technical Writer writing about comprehensive how-to articles, environment set-ups, and technical walkthroughs. Specializes in writing Python, Java, Spring, and SQL articles.

LinkedIn

相關文章 - Python Dictionary