字典是Python中强大的内置数据结构,以键值对的形式存储数据。字典理解在从现有的字典和迭代表中创建新的字典时可以起到超级大的帮助。
在本教程中,我们将通过编码一些简单的例子来学习字典理解在Python中是如何工作的。
什么是 Python 中的字典?
Python 中的字典允许我们在两组值,即键和值之间存储一系列的映射关系 :
- 字典中的所有项目都被包围在一对大括号中
{}。 - dictionary 中的每个项目都是一个键和一个值之间的映射--称为键值对。
- 一个键值对通常被称为一个 dictionary项目。
- 你可以用各自的键来访问这些值。
下面是一个字典的一般例子:
my_dict = {"key1":<value1>,"key2":<value2>,"key3":<value3>,"key4":<value4>}
在上面的例子中:
- 字典
my_dict包含 4 个键值对(项目)。 "key1"通过 是 4 个键。"key4"- 你可以用
my_dict["key1"]来访问<value1>,my_dict["key2"]来访问<value2>,以此类推。
现在我们知道什么是 Python 字典了,让我们继续学习字典理解。
如何使用字典理解法从一个 Iterable 创建一个 Python 字典
在这一节中,让我们用字典理解法从一个可迭代的对象,例如一个 list 或一个 tuple,创建一个 Python 字典。
如果我们选择即时生成键或值,我们可以只用一个可迭代的 Python 字典来创建一个新的字典:
当我们选择即时生成值时,我们可以使用迭代器中的项目作为键,反之亦然。
一般的语法如下所示。请注意,<>之间的名称是实际变量名称的占位符:
<dict_name> = {<new_key>:<new_value> for <item> in <iterable>}
让我们来解析一下上面的语法:
{}表示我们正在填充一个字典。- 对于 iterable 中的每个项目,我们在 dictionary 中生成一个键值对。
▶是时候来个快速的例子了。
Python Dictionary 理解 - 例 1
假设我们有一个访问我们商店的顾客列表,我们想给每个顾客提供一个随机的折扣。我们希望折扣值在1美元到100美元之间的任何地方:
在Python中,
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]
我们现在可以继续使用字典理解法来创建一个每周温度的字典:
# Creating a dictionary of weekly tempertaures
# from the list of temperatures and days
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() 方法
到目前为止,我们已经看到如何使用键来访问值。我们如何访问字典中所有的键值对呢?
要做到这一点,我们可以调用 dictionary 上的items() 方法来获取所有的键值对,如下面的代码片段所示:
discount_dict.items()
# Output
dict_items([('Alex', 16), ('Bob', 26), ('Carol', 83), ('Dave', 21), ('Flow', 38), ('Katie', 47), ('Nate', 89)])
如何使用 Dictionary Comprehension 从现有的 Dictionary 中创建一个 Python Dictionary
假设我们已经有一个 Python 字典。📚
但是,我们想创建一个新的字典 ,它只包含我们字典中满足某个特定条件的项目。Dictionary Comprehension 在做这件事时可以非常方便:
<dict_name> = {<new_key>:<new_value> for (key,value) in <dict>.items() if <condition>}
让我们解析一下上面的语法。我们使用items() 方法,得到现有 dictionary 中的所有 key-value 对:
- 我们访问第一个字典项,并检查
condition是否被评估为True。 - 如果条件是
True,我们把第一个项目添加到我们的新字典中。 - 然后我们对现有字典中的所有项目重复这些步骤。
▶让我们举个例子来看看这是如何工作的。
Python Dictionary Comprehension - 例 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。
请注意,Alex 、Bob 、Dave ,这些得到少于30美元折扣的人已经被添加到新的字典中。
总结
让我们总结一下我们在本教程中所学到的东西。我们已经看到了如何使用 Dictionary Comprehension 来创建 Python 字典:
- 只有一个可迭代的数据。
- 两个可迭代变量,以及
- 一个现有的字典,使用条件来过滤这些项目。
谢谢你的阅读,祝你学习愉快!🎉