Python 中的字典理解——实例介绍

2021-08-25 10:46:45 浏览数 (3048)

字典是 Python 中强大的内置数据结构,可将数据存储为键值对。字典理解对于从现有字典和可迭代对象创建新字典非常有帮助。在本教程中,我们将通过编写一些简单的示例来了解字典推导式在 Python 中的工作原理。

什么是 Python 中的字典?

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

  • 字典中的所有项目都包含在一对花括号内{}。
  • 字典中的每一项都是键和值之间的映射——称为键值对。
  • 键值对通常称为字典项。
  • 您可以使用相应的键访问这些值。

这是字典的一般示例:

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

在上面的例子中,

  • 字典my_dict包含 4 个键值对(项目)。
  • "key1"通过"key4"是4个键。
  • 您可以使用my_dict["key1"]to access <value1>、my_dict["key2"]to access<value2>等。

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

如何使用字典理解从可迭代对象创建 Python 字典

在本节中,让我们使用字典理解从可迭代对象(例如列表或元组)创建 Python 字典。

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

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

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

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

让我们解析上面的语法。

  • {} 表示我们正在填充字典。
  • 对于迭代中的每个项目,我们在字典中生成一个键值对。

▶ 是时候举个简单的例子了。

Python 词典理解 - 示例 1

假设我们有一个访问我们商店的客户列表,我们想为每个客户提供随机折扣。我们希望折扣值介于 1 美元到 100 美元之间。

在 Python 中,random.randint(i,j)返回i和之间的随机整数j,其中两个端点都包含在内。

因此,我们可以使用randint()Python 的 random 模块中的函数为列表中的每个客户生成 $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() 方法

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

为此,我们可以调用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% 的折扣。

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

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和Davewho 的折扣低于 30 美元添加到新词典中。

结论

让我们总结一下我们在本教程中学到的东西。我们已经看到了如何使用 Dictionary Comprehension 从以下内容创建 Python 词典:

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

感谢您的阅读。祝学习愉快!