原文: 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_1
和 list_2
- list_1
包含键,list_2
包含相应的值。
现在我们可以使用 Python 的 zip()
函数来压缩这两个列表以生成键值对。
zip
所以,第一个元组是第一个键-值对,第二个元组是第二个键-值对......第 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() 函数。