字典是Python中的唯一的映射类型,也是一个容器类型。Python的字典能够存储任意个数的Python对象,也包括其他容器类型。创建一个基本的字典,需要包括字典名称,以及用花括号扩起来的键值对,如下所示:
alien_0 = {'coclor': 'green','points' : 5}
在上例中可以看到,一个基本的字典创建所需的所有元素,字典名称、花括号以及键值对,不同的键值对用逗号隔开,要想访问这个字典的值,最基本的方法如下所示:
alien_0 = {'coclor': 'green','points' : 5} print(alien_0['coclor']) print(alien_0['points'])
如上例所示,通过字典名称引用键来获取值,是字典值访问的常用方式,输出结果如下所示:
green
5
对于值的操作,惯例来说是有四种方式的,即增删改查!上例中的方式算是查询值,那么对于增删改的操作则如下所示:
#创建字典person存储姓名,年龄和城市字段 person = {'name':'张飞','age':18,'city':'河北'} print("最初的字典值:") print(person) print("---------------------------------------------------------------") #添加武器作为新的值 person['arms'] = '丈八蛇矛' print("添加新键值对的字典值:") print(person) print("---------------------------------------------------------------") #删除上段代码中添加的武器 del person['arms'] print("删除键值对的字典值:") print(person) print("---------------------------------------------------------------") #修改姓名和年龄 person['name'] = '刘备' person['age'] = 20 print("修改最初键值对的字典值:") print(person)
上述中的增删改操作,都是对字典值的永久性变更操作,因此对于输出结果来说,是无法倒退回去的,想要恢复原值只能重新构建或修改回去,上例输出结果如下所示:
最初的字典值: {'name': '张飞', 'age': 18, 'city': '河北'} --------------------------------------------------------------- 添加新键值对的字典值: {'name': '张飞', 'age': 18, 'city': '河北', 'arms': '丈八蛇矛'} --------------------------------------------------------------- 删除键值对的字典值: {'name': '张飞', 'age': 18, 'city': '河北'} --------------------------------------------------------------- 修改最初键值对的字典值: {'name': '刘备', 'age': 20, 'city': '河北'}
对于Python中字典值增删改查的基本操作,如上所示,大都是直接引用的操作,而对于字典的遍历则相对复杂,它包含对键的遍历,对值的遍历和对所有内容的遍历。
对于键值对的遍历,可以使用函数" items() "来实现,以习题6-3为例:
vocabulary = {'int':'整型','float':'浮点型','string':'字符串','date':'日期型','number':'数值型'} for key,value in vocabulary.items(): print(key + "是" + value!\n")
如上例所示," items() "函数的使用很简单,首先构建字典vocabulary,然后在for循环中定义变量key和value,用来存储键和值的结果,接着让字典引用函数" items() "取出其中的键值对,最后输出结果即可," items() "方法能够返回键值对的列表,输出结果如下所示:
int是整型!
float是浮点型!
string是字符串!
date是日期型!
number是数值型的!
并不是任何情况下使用字典的时候,我们都要遍历字典全部键值对的,有时候可能只需要遍历键或者遍历值来满足特定的需求,这是就要用到函数" keys() "和" values() "来专门获取字典的键和值,如下所示:
vocabulary = {'int':'整型','float':'浮点型','string':'字符串','date':'日期型','number':'数值型'} #遍历字典中所有的键 print("用函数keys()来获取键:") for key in vocabulary.keys(): print("\t" + key) print("\n---------------------------------------------------------------\n") #遍历字典中所有的值 print("用函数values()来获取值:") for value in vocabulary.values(): print("\t" +value)
上例中,分别定义变量key和value,来存储通过函数" keys() "和" values() "获取到的键和值的结果,输出结果如下所示:
用函数keys()来获取键: int float string date number --------------------------------------------------------------- 用函数values()来获取值: 整型 浮点型 字符串 日期型 数值型
事实上对于结合之前学习的各种知识的例题,书中有很多很有趣的案例,比如说遍历字典时添加if判断的例子,如下所示:
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(name.title() + "'s favorite language is " ",I see your favorite language is " + favorite_languages[name].title())
在这个例子中,先创建了一个字典favorite_languages,紧接着又创建了一个列表friends,里面包含了字典favorite_languages中的部分键,for循环的意义在于,当键的值不在列表 friends中时,只输出姓名,否则需要输出完整的话来,输出结果如下所示:
Jen Sarah Sarah's favorite language is ,I see your favorite language is C Edward Phil Phil's favorite language is ,I see your favorite language is Python
这是一种很有用的例子,比如你在分发考卷时,需要叫一次人名上来一个同学,如果叫到你的朋友,而他考的很不错的时候,你可以加上一句:伙计,干的漂亮!推而广之,很多地方都会用到这个方法。
在开头的时候,我们说到字典是一种容器类型,他也可以存储其他容器类型,比如存储列表,甚至存储字典!当然,同为容器类型的列表,也可以存储字典,如下所示:
alien_0 = {'color':'green','points':5} alien_1 = {'color':'yellow','points':10} alien_2 = {'color':'red','points':15} aliens = [alien_0,alien_1,alien_2] for alien in aliens: print(alien)
这是书中的例子,将三个字典放在一个列表里,输出结果如下所示:
{'color': 'green', 'points': 5} {'color': 'yellow', 'points': 10} {'color': 'red', 'points': 15}
由上例可以看出,将自丢按存入列表中的时候,字典其实是作为列表中的元素的状态存在的,因此访问这些字典的时候,用的也是最基础的列表访问的方法。当打开列表获取到列表中的元素以后,想要访问字典里面的键值对,当然也应该用访问字典的方式来操作字典的值,如书中例子所示:
aliens = [] #通过range()函数生成30条数据 for alien_number in range(30): new_alien = {'color': 'green', 'points': 5,'speed':'slow'} aliens.append(new_alien) print("获取前五条数据,并查看列表长度") for aline in aliens[:5]: print(aline) print("……") print("Total number of aliens: " + str(len(aliens))) print("---------------------------------------------------------------") #修改前三条数据的值 for alien1 in aliens[:3]: if alien1['color'] == 'green': alien1['color'] = 'yellow' alien1['points'] = 10 alien1['speed'] = 'medium' print("查看前五条数据的变化") for aline1 in aliens[:5]: print(aline1)
先创建空列表aliens来存储生成的数据,然后根据不同的需求,分别对数据进行处理,对应的输出结果如下所示:
获取前五条数据,并查看列表长度 {'color': 'green', 'points': 5, 'speed': 'slow'} {'color': 'green', 'points': 5, 'speed': 'slow'} {'color': 'green', 'points': 5, 'speed': 'slow'} {'color': 'green', 'points': 5, 'speed': 'slow'} {'color': 'green', 'points': 5, 'speed': 'slow'} …… Total number of aliens: 30 --------------------------------------------------------------- 查看前五条数据的变化 {'color': 'yellow', 'points': 10, 'speed': 'medium'} {'color': 'yellow', 'points': 10, 'speed': 'medium'} {'color': 'yellow', 'points': 10, 'speed': 'medium'} {'color': 'green', 'points': 5, 'speed': 'slow'} {'color': 'green', 'points': 5, 'speed': 'slow'}
由上例可以看出,对于列表中字典值的修改,其实就是多了一步从列表中取出字段的步骤,当字典取出后的操作方式就是处理字典的操作方式。同理字典嵌套列表的操作方式也应当如此,先获取字典中的列表,再直接操作列表,如下所示:
#构建字典favorite_languages,每个人名对应喜欢的语言 favorite_languages= { 'jen' : ['python','ruby'], 'sarah' : ['c'], 'edward' : ['ruby','go'], 'phil' : ['python'], } #在for循环中对每个人喜欢的语言数量进行判断,输出不同的语句 for name,languages in favorite_languages.items(): if len(languages) > 1: print("\n" + name.title() + "'s favorite languages are:") for language in languages: print("\t" + language.title()) elif len(languages) == 1: print("\n" + name.title() + "'s favorite language is:") for language in languages: print("\t" + language.title())
上例是根据书中例子更改后得到的,先定义字典favorite_languages,然后按照人名为键,分别输入他们喜欢的语言一门或数门,在下方通过for循环,针对每个人喜欢语言数量的不同,分别输出相对应的语句,输出结果如下所示:
Jen's favorite languages are: Python Ruby Sarah's favorite language is: C Edward's favorite languages are: Ruby Go Phil's favorite language is: Python
显然,Sarah和Phil的输出与Jen跟Edward的不同,这道题的难点在于你可能想不到如何处理判断喜欢语言数量的问题,因为len()函数的灵活运用对于新人来说,可能有些难以联想到。
无论是字典嵌套列表还是列表嵌套字典,理清关系后处理起来都不是特别复杂,但是对于字典嵌套字典的问题,有时候会因为数据量的关系,导致处理起来相对复杂。不过从例题的角度上来说,我们不给自己找麻烦,如下所示:
users = { 'aeinstein' : { 'first':'albert', 'last':'einstein', 'location':'princetion', }, 'mcurie' : { 'first': 'marie', 'last': 'curie', 'location': 'paris', } } for username,user_info in users.items(): print("\nUsername: " + username) full_name = user_info['first'] + " " + user_info['last'] location = user_info['location'] print("\tFull name:" + full_name.title()) print("\tLocation:" + location.title())
这是一道书上的例题,定义字典users,用来存储两个键'aeinstein'和'mcurie',他们的值都是字典。案例中的处理方式是直接谁用处理普通字典的方式打开外层的字典,再用相同的方式处理内层嵌套的字典,这种处理方式并不复杂,但麻烦的地方在于有时候嵌套进去的每个内层字典的键值对未必是一样的,因此批量处理的时候会很麻烦。
PS:以上是关于字典内容的小结,关于课后习题,除了在文中距离的部分外,还有几道我觉得挺有意思的,一并发上来做记录吧!
#6-7 #在为完成练习6-1而编写的程序中,再创建两个表示人的字典, #然后将这三个字典都存储在一个名为people 的列表中。遍历这个列表,将其中每个人的所有信息都打印出来。 person_1 = {'first_name':'刘','last_name':'备','age':20,'city':'河北'} person_2 = {'first_name':'关','last_name':'羽','age':19,'city':'山西'} person_3 = {'first_name':'张','last_name':'飞','age':18,'city':'河北'} persons = [person_1,person_2,person_3] #遍历方式一: print(persons) print("---------------------------------------------------------------") #遍历方式二: for person in persons: print(person) print("---------------------------------------------------------------") #加点花样: for person in persons: full_name = person['first_name'] + person['last_name'] print(person['city'] + full_name + "现在" + str(person['age']) + "岁!") #输出结果如下: [{'first_name': '刘', 'last_name': '备', 'age': 20, 'city': '河北'}, {'first_name': '关', 'last_name': '羽', 'age': 19, 'city': '山西'}, {'first_name': '张', 'last_name': '飞', 'age': 18, 'city': '河北'}] --------------------------------------------------------------- {'first_name': '刘', 'last_name': '备', 'age': 20, 'city': '河北'} {'first_name': '关', 'last_name': '羽', 'age': 19, 'city': '山西'} {'first_name': '张', 'last_name': '飞', 'age': 18, 'city': '河北'} --------------------------------------------------------------- 河北刘备现在20岁! 山西关羽现在19岁! 河北张飞现在18岁!
#6-9 #创建一个名为favorite_places 的字典。 #在这个字典中,将三个人的名字用作键; #对于其中的每个人,都存储他喜欢的1~3个地方。为让这个练习更有趣些,可让一些朋友指出他们喜欢的几个地方。 #遍历这个字典,并将其中每个人的名字及其喜欢的地方打印出来。 secnis_spot = { '张三' : ['莫斯科','多伦多'], '李四' : ['东京','希腊','新加坡'], '王五' : ['墨西哥','奥地利'], } for name,citys in secnis_spot.items(): print(name.title() + "喜欢的地方是:") for city in citys: print("\t" + city.title()) #输出结果如下: 张三喜欢的地方是: 莫斯科 多伦多 李四喜欢的地方是: 东京 希腊 新加坡 王五喜欢的地方是: 墨西哥 奥地利
# 6-11 # 创建一个名为cities 的字典,其中将三个城市名用作键; # 对于每座城市,都创建一个字典,并在其中包含该城市所属的国家、 # 人口约数以及一个有关该城市的事实。#在表示每座城市的字典中,应包含country 、population 和fact 等键。 # 将每座城市的名字以及有关它们的信息都打印出来。 cities = { '北京': { '国家': '中国', '人口': '2171万', '事实': '中国首都' }, '墨尔本': { '国家': '澳大利亚', '人口': '500万', '事实': '旅游城市' }, '东京': { '国家': '日本', '人口': '946万', '事实': '房价很贵' }, } for name, citys in cities.items(): print(name + "的情况如下:") for n, city in citys.items(): print("\t" + n + " : " + city) #输出结果如下: