一、使用字典
一个简单的字典
字典是一系列键——值对。每个键都与一个值相关联,可以使用键来访问与之相关联的值。与键相关联的值可以是数字、字符串、列表乃至字典。事实上,可将任何Python对象用作字典中的值。
在Python中,字典用放在花括号{}中的一系列键——值对表示。
键——值对是两个相关联的值。指定键时,Python将返回与之相关联的值。键和值之间用冒号分隔,而键——值对之间用逗号分隔。在字典中,想存储多少个键——值对都可以。最简单的字典只有一个键——值对。
1、访问字典中的值
要获取与键相关联的值,可依次指定字典名和放在方括号内的键。
字典中可包含任意数量的键——值对。
str(new_points)是将得到的5转换成字符串
2、添加键——值对
字典是一种动态结构,可随时在其中添加键——值对。要添加键——值对,可依次指定字典名、用方括号括起的键和相关联的值。
键—值对的排列顺序与添加顺序不同。(书上是这么写的,但是为啥我的顺序相同)
Python不关心键——值对的添加顺序,而只关心键和值之间的关联关系。
3、先创建一个空字典
有时候,在空字典中添加键—值对是为了方便,而有时候必须这样做。为此,可先使用一对空的花括号定义一个字典,再分行添加各个键——值对。
使用字典来存储用户提供的数据或在编写能自动生成大量键——值对的代码时,通常都需要先定义一个空字典。
4、 修改字典中的值
要修改字典中的值,可依次指定字典名、用方括号括起的键以及与该键相关联的新值。
5、删除键——值对
对于字典中不再需要的信息,可使用del语句将相应的键—值对彻底删除。使用del语句时,必须指定字典名和要删除的键。
del(alien_0['points'])换成del alien_0['points']也行
删除的键—值对永远消失了
6、由类似对象组成的字典
可以使用字典来存储众多对象的同一种信息
定义好字典后,在最后一个键—值对的下一行添加一个右花括号,并缩进四个空格,使其与字典中的键对齐。另外一种不错的做法是在最后一个键—值对后面也加上逗号,为以后在下一行添加键—值对做好准备。
将较长的print语句分成多行:
二、遍历字典
一个Python字典可能只包含几个键—值对,也可能包含数百万个键—值对。鉴于字典可能包含大量的数据,Python支持对字典遍历。字典可用于以各种方式存储信息,因此有多种遍历字典的方式:可遍历字典的所有键—值对、键或值。
1、遍历所有的键——值对
要编写用于遍历字典的for循环,可声明两个变量,用于存储键—值对中的键和值。对于这两个变量,可使用任何名称。
上面for语句中包含字典名和方法items(),它返回一个键—值对列表。
即便遍历字典时,键—值对的返回顺序也与存储顺序不同(我这里还是相同)。Python不关心键—值对的存储顺序,而只跟踪键和值之间的关联关系。
2、 遍历字典中的所有键
在不需要使用字典中的值时,方法keys()很有用。
遍历字典时,会默认遍历所有的键,因此,如果将上述代码中的for name in favorite_language.keys():替换为for name in favorite_language:输出将不变。显式地使用方法keys()可让代码更容易理解。
3、按顺序遍历字典中的所有键
字典总是明确地记录键和值之间的关联关系,但获取字典的元素时,获取顺序是不可预测的。这不是问题,因为通常你想要的只是获取与键相关联的正确的值。
要以特定的顺序返回元素,一种办法是在for循环中对返回的键进行排序。为此,可使用函数sorted()来获得按特定顺序排列的键列表的副本。
4、遍历字典中的所有值
方法values()返回一个值列表,而不包含任何键。
这种做法提取字典中所有的值,而没有考虑是否重复。涉及的值很少时,这也许不是问题,但如果被调查者很多,最终的列表可能包含大量的重复项。
为剔除重复项,可使用集合(set)。集合类似于列表,但每个元素都必须是独一无二的。
通过对包含重复元素的列表调用set()可让Python找出列表中独一无二的元素,并使用这些元素来创建一个集合。
三、 嵌套
有时需要将一系列字典存储在列表中,或将列表作为值存储在字典中,这称为嵌套。你可以在列表中嵌套字典、在字典中嵌套列表甚至在字典中嵌套字典。
1、字典列表
经常需要在列表中包含大量的字典,而其中每个字典都包含特定对象的众多信息。
2、在字典中存储列表
每当需要在字典中将一个键关联到多个值时,都可以在字典中嵌套一个列表。
3、在字典中存储字典
#6-1人
#使用一个字典来存储一个熟人的信息,包括名、姓、年龄和居住的城市。
#该字典应包含键first_name、last_name、age和city。
#将存储在该字典中的每项信息都打印出来。
people = {'first_name':'Si','last_name':'Zhao','age':40,'city':'Tieling',}
print("The first_name is "+people['first_name']+".")
print("The last_name is "+people['last_name']+".")
print("His name is "+people['last_name']+" "+people['first_name']+".")
print("He is "+str(people['age'])+" yesrs old.")
print("He is living in "+people['city']+" now.")#6-2喜欢的数字
#使用一个字典来存储一些人喜欢的数字
#请想出5个人的名字,并将这些名字用作字典中的键
#想出每个人喜欢的一个数字,并将这些数字作为值存储在字典中
#打印每个人的名字和喜欢的数字
#为让这个程序更有趣,通过询问朋友确保数据是真实的。
numbers = {'alice':'4','bob':'5','ken':'9','james':'8','june':'3',}
print("Alice's favorite number is "+numbers['alice']+".")
print("Bob's favorite number is "+numbers['bob']+".")
print("ken's favorite number is "+numbers['ken']+".")
print("James's favorite number is "+numbers['james']+".")
print("June's favorite number is "+numbers['june']+".")#6-3词汇表
#Python字典可用于模拟现实生活中的字典,但为避免混淆,我们将后者称为词汇表。
#想出你在前面学过的5个编程词汇,将它们用作词汇表中的键,并将它们的含义作为值存储在词汇表中。
#以整洁的方式打印每个词汇及其含义。
#为此,你可以先打印词汇,在它后面加上一个冒号,再打印词汇的含义;
#也可在一行打印词汇,再使用换行符(n)插入一个空行,然后在下一行以缩进的方式打印词汇的含义。
cihui = {'列表':'是基本数据结构','字典':'一系列键——值对','变量':'不确定值的量','函数':'完成特定功能的程序','编译':'把高级语言编程二进制语言',
}
print("列表"+":"+cihui['列表'])
print("字典"+":"+cihui['字典'])
print("变量"+":"+cihui['变量'])
print("函数"+":"+cihui['函数'])
print("编译"+":"+cihui['编译'])#6-4词汇表2
#既然你知道了如何遍历字典,现在请整理你为完成练习6-3而编写的代码
#将其中的一系列print语句替换为一个遍历字典中的键和值的循环。
cihui = {'list':'是基本数据结构','dict':'一系列键——值对','var':'不确定值的量','fun':'完成特定功能的程序','com':'把高级语言编程二进制语言',
}
for key, value in cihui.items():print(key+": "+value)#6-5河流
#创建一个字典,在其中存储三条大河流及其流经的国家。
#其中一个键—值对可能是'nile': 'egypt'。
#使用循环为每条河流打印一条消息,如“The Nile runs through Egypt.”。
#使用循环将该字典中每条河流的名字都打印出来。
#使用循环将该字典包含的每个国家的名字都打印出来。
rivers = {'nile': 'egypt','changjiang': 'china','huanghe': 'china'
}
for river, country in rivers.items():print("The "+river.title()+" runs through "+country.title()+".")
for river in rivers.keys():print(river.title())
for country in rivers.values():print(country.title())#6-6调查
#在6.3.1节编写的程序favorite_languages.py中执行以下操作
#创建一个应该会接受调查的人员名单,其中有些人已包含在字典中,而其他人未包含在字典中。
#遍历这个人员名单,对于已参与调查的人,打印一条消息表示感谢
#对于还未参与调查的人,打印一条消息邀请他参与调查。
favorite_language = {'jen': 'python','sarah': 'c','edward': 'ruby','phil': 'python',}
wei = ['erin', 'june', 'bob']
for name in favorite_language:print(name.title()+", thank you for taking for the poll.")
for name in wei:if name not in favorite_language:print("Hi "+name.title()+", I'm inviting you to take the poll.")#6-7人
#在为完成练习6-1而编写的程序中,再创建两个表示人的字典
#然后将这三个字典都存储在一个名为people的列表中
#遍历这个列表,将其中每个人的所有信息都打印出来。
people_0 = {'first_name':'Si','last_name':'Zhao','age':40,'city':'Tieling',}
people_1 = {'first_name':'Xing','last_name':'Wang','age':20,'city':'Beijing',}
people_2 = {'first_name':'La','last_name':'La','age':35,'city':'Shenyang',}
people = [people_0, people_1, people_2]
for person in people:print(person)#6-8宠物
#创建多个字典,对于每个字典,都使用一个宠物的名称来给它命名
#在每个字典中,包含宠物的类型及其主人的名字
#将这些字典存储在一个名为pets的列表中
#再遍历该列表,并将宠物的所有信息都打印出来
pet_0 = {'type':'cat','zhuren':'alice'
}
pet_1 = {'type':'dog','zhuren':'bob'
}
pets = [pet_0, pet_1]
for pet in pets:print(pet)#6-9喜欢的地方
#创建一个名为favorite_places的字典
#在这个字典中,将三个人的名字用作键
#对于其中的每个人,都存储他喜欢的1~3个地方
#遍历这个字典,并将其中每个人的名字及其喜欢的地方打印出来
favorite_places = {'alice':['hangzhou', 'sanya'],'bob':['yunnan','chongqing'],'june':['sichuan', 'caoyuan', 'dalian']
}
for name, places in favorite_places.items():print("n"+name.title()+"'s favorite places are: ")for place in places:print(place.title())#6-10喜欢的数字
#修改为完成练习6-2而编写的程序
#让每个人都可以有多个喜欢的数字
#然后将每个人的名字及其喜欢的数字打印出来
numbers = {'alice':['4','6','9'],'bob':['5','4','7','9'],'ken':['2','5','8'],'james':['8','6','4'],'june':['3','6','9'],}
for name, numbers in numbers.items():print(name.title()+"'s favorite numbers are:")for number in numbers:print(number)#6-11城市
#创建一个名为cities的字典,其中将三个城市名用作键
#对于每座城市,都创建一个字典,并在其中包含该城市所属的国家、人口约数以及一个有关该城市的事实
#在表示每座城市的字典中,应包含country、population和fact等键
#将每座城市的名字以及有关它们的信息都打印出来
cities = {'sanya':{'country':'china','population':300000,'fact':'nanfang',},'yunnan':{'country':'china','population':5000000,'fact':'nanfang',},'dalian':{'country':'china','population':200000,'fact':'beifang',},
}
for city_name, city_info in cities.items():print("nCity:"+city_name.title())population = city_info['population']fact = city_info['fact']print("t有"+ str(population) +"人口")print("t在"+fact)