如何在 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