一个Python字典可能只包含几个键—值对,也可能包含数百万个键—值对。鉴于字典可能包含大量的数据,Python支持对字典遍历。字典可用于以各种方式存储信息,因此有多种遍历字典的方式:可遍历字典的所有键—值对、键或值。

6.3.1 遍历所有的键—值对

探索各种遍历方法前,先来看一个新字典,它用于存储某征婚网站用户的信息。下面的字典存储一名用户的用户名、名和姓:

  1. user_0 = {
  2. 'user_name': '吃喵酱的花椒',
  3. 'first': 'thomas',
  4. 'last': 'pan',
  5. }

利用本章前面介绍过的知识,可访问user_0的任何一项信息,但如果要获悉该用户字典中的所有信息,该怎么办呢?可以使用一个for循环来遍历这个字典:

  1. for key, value in user_0.items():
  2. print(key + ': ' + value)

输出:


user_name: 吃喵酱的花椒
first: thomas
last: pan


注意,即便遍历字典时,键—值对的返回顺序也与存储顺序不同。Python不关心键—值对的存储顺序,而只跟踪键和值之间的关联关系。

在6.2.6节的示例favorite_languages中,字典存储的是不同人的同一种信息;对于类似这样的字典,遍历所有的键—值对很合适。如果遍历字典favorite_languages,将得到其中每个人的姓名和喜欢的编程语言。由于其中的键都是人名,而值都是语言,因此我们在循环中使用变量name和language,而不是key和value,这让人更容易明白循环的作用:

  1. favorite_languages = {
  2. 'six': 'python',
  3. 'thomas': 'c++',
  4. 'edward': 'ruby',
  5. 'phil': 'python',
  6. }
  7. for key, value in favorite_languages.items():
  8. 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,并将每个被调查者的名字都打印出来:

  1. favorite_languages = {
  2. 'six': 'python',
  3. 'thomas': 'c++',
  4. 'edward': 'ruby',
  5. 'phil': 'python',
  6. }
  7. for key in favorite_languages.keys():
  8. print(key.title())

上面的代码行让Python提取字典favorite_languages中的所有键,并依次将它们存储到变量key中。输出列出了每个被调查者的名字:


Six
Thomas
Edward
Phil


遍历字典时,会默认遍历所有的键,因此,如果将上述代码中的for key in favorite_ languages.keys():替换为for key in favorite_languages:,输出将不变,如:

  1. favorite_languages = {
  2. 'six': 'python',
  3. 'thomas': 'c++',
  4. 'edward': 'ruby',
  5. 'phil': 'python',
  6. }
  7. for key in favorite_languages:
  8. print(key.title())

输出跟带有key()的代码一样:


Six
Thomas
Edward
Phil


在这种循环中,可使用当前键来访问与之相关联的值。下面来打印两条消息,指出两位朋友喜欢的语言。我们像前面一样遍历字典中的名字,但在名字为指定朋友的名字时,打印一条消息,指出其喜欢的语言:

  1. favorite_languages = {
  2. 'six': 'python',
  3. 'thomas': 'c++',
  4. 'edward': 'ruby',
  5. 'phil': 'python',
  6. }
  7. friends = ['six', 'thomas']
  8. for key in favorite_languages.keys():
  9. print(key.title())
  10. if key in friends:
  11. 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()来获得按特定顺序排列的键列表的副本:

  1. favorite_languages = {
  2. 'six': 'python',
  3. 'thomas': 'c++',
  4. 'edward': 'ruby',
  5. 'phil': 'python',
  6. }
  7. for key in sorted(favorite_languages.keys()):
  8. print(key.title())

这条for语句类似于其他for语句,但对方法dictionary.keys()的结果调用了函数sorted()。这让Python列出字典中的所有键,并在遍历前对这个列表进行排序。输出表明,按顺序显示了所有被调查者的名字:


Edward
Phil
Six
Thomas


6.3.4 遍历字典中的所有值

如果你感兴趣的主要是字典包含的值,可使用方法values(),它返回一个值列表,而不包含任何键。例如,如果我们想获得一个这样的列表,即其中只包含被调查者选择的各种语言,而不包含被调查者的名字,可以这样做:

  1. favorite_languages = {
  2. 'six': 'python',
  3. 'thomas': 'c++',
  4. 'edward': 'ruby',
  5. 'phil': 'python',
  6. }
  7. print("The following languages have been mentioned:")
  8. for language in favorite_languages.values():
  9. 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