遍历字典
单个 Python 字典可以只包含几个键值对或数百万对。 因为字典可以包含大量数据,所以 Python 允许您循环遍历字典。 字典可用于以多种方式存储信息; 因此,存在几种不同的方法来遍历它们。 您可以遍历字典的所有键值对、键或值。
遍历所有的键值对
在我们探索不同的循环方法之前,让我们考虑一个新的字典,它被设计用来存储网站上用户的信息。 以下字典将存储一个人的用户名、名字和姓氏:
user_0 = {
'username': 'efermi',
'first': 'enrico',
'last': 'fermi',
}
根据您在本章中学到的知识,您可以访问有关 user_0 的任何单条信息。 但是,如果您想查看存储在该用户字典中的所有内容怎么办? 为此,您可以使用 for 循环遍历字典:
user_0 = {
'username': 'efermi',
'first': 'enrico',
'last': 'fermi',
}
for key, value in user_0.items():
print(f"\nKey: {key}")
print(f"Value: {value}")
要为字典编写 for 循环,您需要为两个变量创建名称,这两个变量将保存每个键值对中的键和值。 您可以为这两个变量选择任何名称。 如果您使用变量名称的缩写,此代码也能正常工作,如下所示:
for k, v in user_0.items()
for 语句的后半部分包括字典的名称,后面是方法 items(),它返回一系列键值对。 然后 for 循环将这些对中的每一对分配给提供的两个变量。 在前面的示例中,我们使用变量来打印每个键,然后是关联的值。 第一次 print() 调用中的“\n”确保在输出中的每个键值对之前插入一个空行:
Key: username
Value: efermi
Key: first
Value: enrico
Key: last
Value: fermi
遍历所有键值对对于像第 96 页上的 favorite_languages.py 示例这样的字典特别有效,它为许多不同的键存储了相同类型的信息。 如果你遍历 favorite_languages 字典,你会得到字典中每个人的名字和他们最喜欢的编程语言。 因为键总是指一个人的名字而值总是一种语言,所以我们将在循环中使用变量名称和语言而不是键和值。 这将使跟踪循环内发生的事情变得更容易:
favorite_languages = {
'jen': 'python',
'sarah': 'c',
'edward': 'rust',
'phil': 'python',
}
for name, language in favorite_languages.items():
print(f"{name.title()}'s favorite language is {language.title()}.")
此代码告诉 Python 遍历字典中的每个键值对。 当它处理每一对时,键被分配给变量名,值被分配给变量语言。 这些描述性名称使查看 print() 调用正在做什么变得更加容易。
现在,只需几行代码,我们就可以显示投票中的所有信息:
Jen's favorite language is Python.
Sarah's favorite language is C.
Edward's favorite language is Rust.
Phil's favorite language is Python.
如果我们的字典存储了对一千甚至一百万人的民意调查结果,这种类型的循环也能正常工作。
遍历字典中的所有键
当您不需要处理字典中的所有值时,keys() 方法很有用。 让我们遍历 favorite_languages 字典并打印参加投票的每个人的名字:
favorite_languages = {
'jen': 'python',
'sarah': 'c',
'edward': 'rust',
'phil': 'python',
}
for name in favorite_languages.keys():
print(name.title())
这个 for 循环告诉 Python 从字典 favorite_languages 中提取所有键并将它们一次一个地分配给变量 name。 输出显示参加投票的每个人的姓名:
Jen
Sarah
Edward
Phil
遍历键实际上是遍历字典时的默认行为,因此如果您这样写,这段代码将具有完全相同的输出:
for name in favorite_languages:
而不是:
for name in favorite_languages.keys():
如果 keys() 方法使您的代码更易于阅读,您可以选择显式使用它,或者如果您愿意,也可以省略它。
您可以使用当前键访问与循环内您关心的任何键关联的值。 让我们向几个朋友打印一条关于他们选择的语言的消息。 我们将像之前一样遍历字典中的名字,但是当名字与我们的一位朋友匹配时,我们将显示一条关于他们最喜欢的语言的消息:
favorite_languages = {
'jen': 'python',
'sarah': 'c',
'edward': 'rust',
'phil': 'python',
}
friends = ['phil', 'sarah']
for name in favorite_languages.keys():
print(f"Hi {name.title()}.")
if name in friends: (1)
language = favorite_languages[name].title() (2)
print(f"\t{name.title()}, I see you love {language}!")
1 | 首先,我们列出要向其打印消息的朋友。 在循环中,我们打印每个人的名字。 然后我们检查我们正在使用的名字是否在列表 friends 中。 |
2 | 如果是,我们使用字典的名字和 name 的当前值作为键来确定这个人最喜欢的语言 。 然后我们打印一个特殊的问候语,包括对他们选择的语言的引用。 |
每个人的名字都被打印出来了,但我们的朋友们收到了一条特殊的信息:
Hi Jen.
Hi Sarah.
Sarah, I see you love C!
Hi Edward.
Hi Phil.
Phil, I see you love Python!
您还可以使用 keys() 方法来查明是否对某个特定的人进行了轮询。 这一次,让我们看看 Erin 是否参加了投票:
favorite_languages = {
'jen': 'python',
'sarah': 'c',
'edward': 'rust',
'phil': 'python',
}
if 'erin' not in favorite_languages.keys():
print("Erin, please take our poll!")
keys() 方法不仅仅用于循环:它实际上返回所有键的序列,而 if 语句只是检查 'erin' 是否在这个序列中。 因为她不是,所以打印了一条消息,邀请她参加投票:
Erin, please take our poll!
按特定的顺序遍历字典中的所有键
循环遍历字典以插入时的相同顺序返回项目。 不过,有时您会希望以不同的顺序遍历字典。
一种方法是在 for 循环中返回时对键进行排序。 您可以使用 sorted() 函数按顺序获取键的副本:
favorite_languages = {
'jen': 'python',
'sarah': 'c',
'edward': 'rust',
'phil': 'python',
}
for name in sorted(favorite_languages.keys()):
print(f"{name.title()}, thank you for taking the poll.")
这个 for 语句类似于其他 for 语句,只是我们将 sorted() 函数包装在 dictionary.keys() 方法周围。 这告诉 Python 获取字典中的所有键并在开始循环之前对它们进行排序。 输出显示参加投票的每个人,姓名按顺序显示:
Edward, thank you for taking the poll.
Jen, thank you for taking the poll.
Phil, thank you for taking the poll.
Sarah, thank you for taking the poll.
遍历字典中的所有值
如果您主要对字典包含的值感兴趣,则可以使用 values() 方法返回不带任何键的值序列。 例如,假设我们只是想要一个在我们的编程语言投票中选择的所有语言的列表,而不需要选择每种语言的人的名字:
favorite_languages = {
'jen': 'python',
'sarah': 'c',
'edward': 'rust',
'phil': 'python',
}
print("The following languages have been mentioned:")
for language in favorite_languages.values():
print(language.title())
这里的 for 语句从字典中提取每个值并将其分配给变量语言。 打印这些值时,我们会得到所有所选语言的列表:
The following languages have been mentioned:
Python
C
Rust
Python
这种方法从字典中提取所有值而不检查重复项。 这可能适用于少量的值,但在有大量受访者的民意调查中,它会导致非常重复的列表。 要查看选择的每种语言而不重复,我们可以使用一个集合。 集合是一个集合,其中每个项目都必须是唯一的:
favorite_languages = {
'jen': 'python',
'sarah': 'c',
'edward': 'rust',
'phil': 'python',
}
print("The following languages have been mentioned:")
for language in set(favorite_languages.values()):
print(language.title())
当您将 set() 包装在包含重复项目的值集合周围时,Python 会识别集合中的唯一项目并从这些项目构建一个集合。 这里我们使用 set() 来提取 favorite_languages.values() 中的独特语言。
结果是参与投票的人提到的语言的非重复列表:
The following languages have been mentioned:
Python
C
Rust
在继续学习 Python 的过程中,您通常会发现该语言的内置功能可以帮助您完全按照自己的意愿处理数据。
您可以直接使用大括号构建一个集合并用逗号分隔元素:
很容易将集合误认为字典,因为它们都用大括号括起来。 当您看到大括号但没有键值对时,您可能正在查看一个集合。 与列表和字典不同,集合不会以任何特定顺序保留项目。 |