如何在 Python 中反转一个字典

Rayven Esplanada 2023年1月30日 2020年11月24日
  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