python之字典深入

遍历字典

在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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值