一个Python字典可能只包含几个键—值对,也可能包含数百万个键—值对。鉴于字典可能包含大量的数据,Python支持对字典遍历。字典可用于以各种方式存储信息,因此有多种遍历字典的方式:可遍历字典的所有键—值对、键或值。
6.3.1 遍历所有的键—值对
探索各种遍历方法前,先来看一个新字典,它用于存储某征婚网站用户的信息。下面的字典存储一名用户的用户名、名和姓:
user_0 = {
'user_name': '吃喵酱的花椒',
'first': 'thomas',
'last': 'pan',
}
利用本章前面介绍过的知识,可访问user_0的任何一项信息,但如果要获悉该用户字典中的所有信息,该怎么办呢?可以使用一个for循环来遍历这个字典:
for key, value in user_0.items():
print(key + ': ' + value)
输出:
user_name: 吃喵酱的花椒
first: thomas
last: pan
注意,即便遍历字典时,键—值对的返回顺序也与存储顺序不同。Python不关心键—值对的存储顺序,而只跟踪键和值之间的关联关系。
在6.2.6节的示例favorite_languages中,字典存储的是不同人的同一种信息;对于类似这样的字典,遍历所有的键—值对很合适。如果遍历字典favorite_languages,将得到其中每个人的姓名和喜欢的编程语言。由于其中的键都是人名,而值都是语言,因此我们在循环中使用变量name和language,而不是key和value,这让人更容易明白循环的作用:
favorite_languages = {
'six': 'python',
'thomas': 'c++',
'edward': 'ruby',
'phil': 'python',
}
for key, value in favorite_languages.items():
print(f'{key.title()}\'s favourite langauge is {value}')
输出:
Six’s favourite langauge is python
Thomas’s favourite langauge is c++
Edward’s favourite langauge is ruby
Phil’s favourite langauge is python
即便字典存储的是上千乃至上百万人的调查结果,这种循环也管用。
6.3.2 遍历字典中的所有键
在不需要使用字典中的值时,方法keys()很有用。下面来遍历字典favorite_languages,并将每个被调查者的名字都打印出来:
favorite_languages = {
'six': 'python',
'thomas': 'c++',
'edward': 'ruby',
'phil': 'python',
}
for key in favorite_languages.keys():
print(key.title())
上面的代码行让Python提取字典favorite_languages中的所有键,并依次将它们存储到变量key中。输出列出了每个被调查者的名字:
Six
Thomas
Edward
Phil
遍历字典时,会默认遍历所有的键,因此,如果将上述代码中的for key in favorite_ languages.keys():替换为for key in favorite_languages:,输出将不变,如:
favorite_languages = {
'six': 'python',
'thomas': 'c++',
'edward': 'ruby',
'phil': 'python',
}
for key in favorite_languages:
print(key.title())
输出跟带有key()的代码一样:
Six
Thomas
Edward
Phil
在这种循环中,可使用当前键来访问与之相关联的值。下面来打印两条消息,指出两位朋友喜欢的语言。我们像前面一样遍历字典中的名字,但在名字为指定朋友的名字时,打印一条消息,指出其喜欢的语言:
favorite_languages = {
'six': 'python',
'thomas': 'c++',
'edward': 'ruby',
'phil': 'python',
}
friends = ['six', 'thomas']
for key in favorite_languages.keys():
print(key.title())
if key in friends:
print(f' Hay {key.title()}, your favourite langauge is {favorite_languages[key]}')
输出:
Six
Hay Six, your favourite langauge is python
Thomas
Hay Thomas, your favourite langauge is c++
Edward
Phil
6.3.3 按顺序遍历字典中的所有键
字典总是明确地记录键和值之间的关联关系,但获取字典的元素时,获取顺序是不可预测的。这不是问题,因为通常你想要的只是获取与键相关联的正确的值。
要以特定的顺序返回元素,一种办法是在for循环中对返回的键进行排序。为此,可使用函数sorted()来获得按特定顺序排列的键列表的副本:
favorite_languages = {
'six': 'python',
'thomas': 'c++',
'edward': 'ruby',
'phil': 'python',
}
for key in sorted(favorite_languages.keys()):
print(key.title())
这条for语句类似于其他for语句,但对方法dictionary.keys()的结果调用了函数sorted()。这让Python列出字典中的所有键,并在遍历前对这个列表进行排序。输出表明,按顺序显示了所有被调查者的名字:
Edward
Phil
Six
Thomas
6.3.4 遍历字典中的所有值
如果你感兴趣的主要是字典包含的值,可使用方法values(),它返回一个值列表,而不包含任何键。例如,如果我们想获得一个这样的列表,即其中只包含被调查者选择的各种语言,而不包含被调查者的名字,可以这样做:
favorite_languages = {
'six': 'python',
'thomas': 'c++',
'edward': 'ruby',
'phil': 'python',
}
print("The following languages have been mentioned:")
for language in favorite_languages.values():
print(language.title())
这条for语句提取字典中的每个值,并将它们依次存储到变量language中。通过打印这些值,就获得了一个列表,其中包含被调查者选择的各种语言:
The following languages have been mentioned:
Python
C++
Ruby
Python
这种做法提取字典中所有的值,而没有考虑是否重复。涉及的值很少时,这也许不是问题,但如果被调查者很多,最终的列表可能包含大量的重复项。为剔除重复项,可使用集合(set)。集合类似于列表,但每个元素都必须是独一无二的:
favorite_languages = {
'six': 'python',
'thomas': 'c++',
'edward': 'ruby',
'phil': 'python',
}
print("The following languages have been mentioned:")
for language in set(favorite_languages.values()):
print(language.title())
结果是一个不重复的列表,其中列出了被调查者提及的所有语言:
The following languages have been mentioned:
Ruby
C++
Python