如何在 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
迴圈中的 k
和 v
分別代表鍵和值。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()
將值轉換為列表,並以字典的值會追加到列表中而不是替換現有值的方式進行操作。
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