原文: Dictionary Comprehension in Python – Explained with Examples

字典是 Python 中强大的内置数据结构,以键-值对的形式存储数据。字典推导式(Dictionary Comprehension)在你从现有的字典和迭代表中创建新的字典时有超级大的帮助。

在本教程中,我们将通过编码一些简单的例子来学习字典推导式在 Python 中如何运行。

Python 中的字典是什么

Python 中的字典允许我们在两组值,即键和值之间,存储一系列的映射关系。

  • 字典中的所有项目都被括在一对大括号 {} 内。
  • 字典中的每个项目都是一个键和一个值之间的映射——叫作键-值对。
  • 一个键-值对通常被称为一个字典项目。
  • 你可以用各个值的键来访问这些值。

下面是字典的一般例子:

my_dict = {"key1":<value1>,"key2":<value2>,"key3":<value3>,"key4":<value4>}

在上面的例子中,

  • 字典 my_dict 包含 4 个键-值对(项目)。
  • "key1""key4" 是 4 个键。
  • 你可以用 my_dict["key1"] 来访问 <value1>,用 my_dict["key2"] 来访问 <value2>,以此类推。

现在我们知道什么是 Python 字典了,让我们继续学习字典推导式。

如何使用字典推导式从一个可迭代对象中创建一个 Python 字典

在这一节中,让我们使用字典推导式从一个可迭代的对象,例如一个列表或一个元组,来创建一个 Python 字典。

如果我们选择即时生成键或值,我们可以只用一个可迭代的 Python 字典来创建一个新的字典。

当我们选择即时生成值时,我们可以使用迭代器中的项目作为键,反之亦然。

一般的语法如下所示。请注意,<> 之间的名称是实际变量名称的占位符。

<dict_name> = {<new_key>:<new_value> for <item> in <iterable>}

分析一下上面的语法:

  • {} 表示我们正在创建一个字典。
  • 对于 iterable 中的每个项目,我们在字典中生成一个键值对。

▶ 看一个示例

Python 字典推导式 - 示例 1

假设我们有一个访问商店的客户名单,我们想给每个客户提供一个随机折扣,折扣值在 1 美元到 100 美元之间。

random.randint(i,j)  i  j

因此,我们可以使用 Python 的随机模块中的 randint() 函数,为列表中的每个客户生成 1 到 100 美元的折扣。

下面的代码片段显示了我们如何从客户列表中创建 discount_dict,一个新的字典。

import random
customers = ["Alex","Bob","Carol","Dave","Flow","Katie","Nate"]
discount_dict = {customer:random.randint(1,100) for customer in customers}
print(discount_dict)

#Output

{'Alex': 16, 'Bob': 26, 'Carol': 83, 'Dave': 21, 'Flow': 38, 'Katie': 47, 'Nate': 89}

上面的例子做了以下工作:

  • 遍历客户列表(customers
  • 使用每个客户的名字作为键
  • 产生一个介于 1 美元和 100 美元之间的随机折扣,作为键的值

如何使用字典推导式从两个可迭代对象中创建一个 Python 字典

如果我们已经有了预定义的包含键和值的迭代表呢?比如,你有两个列表,list_1list_2 - list_1 包含键,list_2 包含相应的值。

现在我们可以使用 Python 的 zip() 函数来压缩这两个列表以生成键值对。

zip
image-95

所以,第一个元组是第一个键-值对,第二个元组是第二个键-值对......第 i 个元组是第 i 个键值对。

在这种情况下,字典推导式采取以下形式:

<dict_name> = {<new_key>:<new_value> for (key,value) in zip(list1,list2)}

解析上述语法是非常简单的。

  • 键和值以元组的形式出现,因为我们已经用 zip() 函数将它们压缩在一起。
  • 现在,我们遍历这个元组的迭代器,为字典获得键值对。

▶ 现在看另一个例子

Python 字典推导式 - 示例 2

假设我们想创建一个关于城市每周温度的字典。天数应该是键,而与天数相对应的温度(摄氏度)应该是值。

假设我们把日子和温度放在两个列表中,如下所示:

days = ["Sunday", "Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"]
temp_C = [30.5,32.6,31.8,33.4,29.8,30.2,29.9]

我们现在可以继续使用字典推导式来创建一个每周温度的字典。

# 创建一个每周温度的字典
# 从温度和日子列表中选择

weekly_temp = {day:temp for (day,temp) in zip(days,temp_C)}

print(weekly_temp)

# Output
{'Sunday': 30.5, 'Monday': 32.6, 'Tuesday': 31.8, 'Wednesday': 33.4, 'Thursday': 29.8, 'Friday': 30.2, 'Saturday': 29.9}

在上面的例子中,我们用 zip() 函数将日子和温度的列表压缩在一起。现在我们可以通过使用任何一天作为键来获取这一天天的温度,如下图所示:

weekly_temp["Thursday"]
# Output
29.8

如何在一个 Python 字典上使用 items() 方法

到目前为止,我们已经看到如何使用键来访问值。我们如何访问字典中的所有键-值对呢?

要做到这一点,我们可以调用字典上的 items() 方法来获取所有的键-值对,如下面的代码片段所示。

discount_dict.items()

# Output
dict_items([('Alex', 16), ('Bob', 26), ('Carol', 83), ('Dave', 21), ('Flow', 38), ('Katie', 47), ('Nate', 89)])

如何使用字典推导式从现有的字典中创建一个 Python 字典

假设我们已经有一个 Python 字典。📚

然而,我们想创建一个新的字典,只包含我们字典中满足特定条件的项目。字典推导式在做这件事时非常方便。

<dict_name> = {<new_key>:<new_value> for (key,value) in <dict>.items() if <condition>}

让我们解析一下上面的语法。我们使用 items() 方法,获得现有字典中的所有键-值对。

  • 我们访问第一个字典项,并检查 condition 是否评估为 True
  • 如果条件为 True,我们把第一个项目添加到新字典中。
  • 然后我们对现有字典中的所有项目重复这些步骤。

▶让我们举个例子来看看这是如何运行的

Python 字典推导式 - 示例 3

让我们在先前创建 discount_dict 字典的折扣例子的基础上,再进一步。让我们再看一下 discount_dict 字典。

{'Alex': 16, 'Bob': 26, 'Carol': 83, 'Dave': 21, 'Flow': 38, 'Katie': 47, 'Nate': 89}

我们看到,一些客户很幸运地得到了比其他客户更高的折扣。让我们解决这个差距,让所有的客户满意。

我们现在想为那些获得少于 30 美元折扣的顾客提供 10% 的折扣,他们在下一次购买时可以使用。✨

在这种情况下,我们要从 discount_dict 字典中创建一个新的字典 customer_10

customer_10 = {customer:discount for (customer, discount) in discount_dict.items() if discount<30}

print(customer_gifts)

# Output
{'Alex': 16, 'Bob': 26, 'Dave': 21}

上面的代码做了以下工作:

  • 对于 discount_dict 中的每一项,它都会挖掘出折扣的值。
  • 如果折扣少于 30 美元,它就把相应的 customer:discount 对添加到新字典 customer_10

请注意得到少于 30 美元折扣的 Alex、Bob 和 Dave 是如何被添加到新的字典里的。

总结

让我们总结一下在本教程中所学到的东西。我们已经看到了如何使用字典推导式来创建 Python 字典:

  • 只有一个可迭代对象
  • 两个迭代对象,以及
  • 一个现有的字典,使用条件来过滤项目

感谢阅读,happy learning!🎉

相关文章

这里有一篇文章介绍了 Python zip() 函数