遍历字典
在python字典中可能是包含几个键-值对,也可能包含数百万个键-值对,鉴于字典可能包含大量的数据,python支持对字典的遍历。字典可用于以各种方式存储信息,因此有多种遍历字典的方式:可遍历字典的所有键-值对,键或值。
1.遍历所有的键-值对
先来看一个简单的字典例子,字典用于存储有关网站用户的信息,下面的字典存储一名用户的用户名,名和姓:
user_0 = {
'username' : 'efermi',
'first' : 'enrico',
'last' : 'fermi',
}
经过前面的学习,我们知道怎么获取字典中的信息,但是如果想要获悉该用户字典中的全部信息呢?想想之前学习的for循环是否可以满足这个需求呢?那我们就来验证一下吧:
user_0 = {
'username' : 'efermi',
'first' : 'enrico',
'last' : 'fermi',
}
for key,value in user_0.items():
print("\nkey: " + key)
print("value: " + value)
看看结果:
book@www.100ask.org:~/python/L8$ python user.py
key: username
value: efermi
key: last
value: fermi
key: first
value: enrico
在for语句中,声明了两个变量,用于存储键-值对中的键和值,对于这两个变量,可使用任何名,for循环后半部分包括了字典名和方法items(),它返回一个键-值列表,然后for循环依次将每一个键-值对存储到指定的两个变量中,然后使用print语句把变量中值打印出来。
注意:即便遍历字典时,键-值对的返回顺序也与存储顺序不同,python不关心键-值对的存储顺序,而只跟踪键-值之间的关联关系。
favorite_languages = {
'jen' : 'python',
'sarah': 'C',
'edward':'ruby',
'phil':'python',
}
for name,language in favorite_languages.items():
print(name.title() + " 's favorite language is " +
language.title() + " . ")
book@www.100ask.org:~/python/L8$ python favorite_languages.py
Sarah 's favorite language is C .
Edward 's favorite language is Ruby .
Jen 's favorite language is Python .
Phil 's favorite language is Python .
2.遍历字典中的所有的键
在不需要使用字典中的值时,方法keys()很有用。下面来使用它看看:
favorite_languages = {
'jen' : 'python',
'sarah': 'C',
'edward':'ruby',
'phil':'python',
}
for name in favorite_languages.keys():
print(name.title())
看看结果:
book@www.100ask.org:~/python/L8$ python favorite_languages.py
Sarah
Edward
Jen
Phil
上面的例子中,只想看看被调查者的名字,所以只打印被调查者的名字。
遍历字典时,会默认遍历所有的键,因此,如果将上述代码中的for name in favorite_languages.keys():替换为for name in favorite——languages:,输出将不变。
如果显示地使用方法keys()可让代码更容易理解,你可以选择这样做,但如果愿意也可以省略它。
在这种循环中,可使用当前键来访问与之相关联的值。下面来打印两条消息,指出两位朋友喜欢的语言。
favorite_languages = {
'jen' : 'python',
'sarah': 'C',
'edward':'ruby',
'phil':'python',
}
friends = ['phil', 'sarah']
for name in favorite_languages.keys():
print(name.title())
if name in friends:
print(" Hi " + name.title() +
" , I see your favorite language is " +
favorite_languages[name].title() + " ! ")
然后呢:
book@www.100ask.org:~/python/L8$ python favorite_languages.py
Sarah
Hi Sarah , I see your favorite language is C !
Edward
Jen
Phil
Hi Phil , I see your favorite language is Python !
我们还可以着用扩展一下,使用keys()确定某个人是否有接受调查,比如:
favorite_languages = {
'jen' : 'python',
'sarah': 'C',
'edward':'ruby',
'phil':'python',
}
if 'erin' not in favorite_languages.keys():
print("Erin, please take our poll!")
然后呢:
book@www.100ask.org:~/python/L8$ python favorite_languages.py
Erin, please take our poll!
方法keys()并非只能用于遍历;实际上,它返回一个列表,其中包含字典中的所有键,因此,在上面的例子中erin不包含在方法keys()返回的列表中,所以就执行if后面缩进的语句。
3.按顺序遍历字典中的所有键
字典总是明确地记录键和值之间的关联关系,但获取字典的元素时,获取顺序是不可预测的,这个不属于问题,因为我们通常想要获取与键相关联的正确的值。
要想以特定的顺序返回元素,一种办法是在for循环中对返回的键进行排序。因此,可以使用sorted()函数来获得按特定顺序排列的键列表的副本,比如:
favorite_languages = {
'jen' : 'python',
'sarah': 'C',
'edward':'ruby',
'phil':'python',
}
for name in sorted(favorite_languages.keys()):
print(name.title() + " , thank you for taking the poll.")
book@www.100ask.org:~/python/L8$ python favorite_languages.py
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.
例子中的for语句和其他的for语句是一样的,不同的是对方法favorite_languages.keys()的结果调用了函数sorted(),这让python列出字典中的所有键,并在遍历前对这个列表进行排序。输出表明,按顺序显示了所有被调查者的名字。
4.遍历字典中的所有值
但如果感兴趣的只是字典中包含的值,可使用方法values(),它返回一个值列表,而不包含任何键。比如,如果我们想获得一个这样的列表,即其中只包含被调查者选择的各种语言,而不包含被调查者的名字,可以如下:
favorite_languages = {
'jen' : 'python',
'sarah': 'C',
'edward':'ruby',
'phil':'python',
}
print("The following languages have been mentioned: ")
for language in favorite_languages.values():
print(language.title())
然后呢:
book@www.100ask.org:~/python/L8$ python favorite_languages.py
The following languages have been mentioned:
C
Ruby
Python
Python
我们只想知道大家主要喜欢哪几种语言,其中肯定有同一种语言被多个人喜欢,所以就会出现重复的现象,你看我们的输出结果就出现了重复,那有没有什么办法,解决这种重复呢?继续往下看:
favorite_languages = {
'jen' : 'python',
'sarah': 'C',
'edward':'ruby',
'phil':'python',
}
print("The following languages have been mentioned: ")
for language in set(favorite_languages.values()):
print(language.title())
book@www.100ask.org:~/python/L8$ python favorite_languages.py
The following languages have been mentioned:
Python
C
Ruby
为了解决有大量数据时,有重复的结果产生,我们可以使用python中集合(set),集合类似于列表,但每个元素都必须独一无二,在上面的例子中我们对favorite_languages.values()方法使用集合set提取出了一个不重复的列表。
随着对python的不断深入研究和学习,我们会发现python内置的功能可帮助我们以希望的方式处理数据。随着工作中有很多开发平台会提供很多软件支持包,提供各种API。