在本篇博客中,你将能学习到能够将相关信息关联起来的Python字典,以及一些对字典的操作。
在讲正事之前,不能忘了上一篇博客布置下来的作业:
执行以下操作以创建一个程序,该程序模拟网站如何确保每个人都有唯一的用户名。
•列出包含五个或更多用户名的列表current_users;再列出包含五个新用户名的列表new_users,
确保一个或两个新用户名也在当前用户列表中。
•循环浏览新用户列表,查看每个新用户名是否已被使用。如果有,请打印一条消息,说明此人需要输入新的用户名。
如果没有使用用户名,请打印一条消息,说明用户名可用。
•确保你的比较不区分大小写。如果使用了“john”,则不应接受“JOHN”
答案如下:
current_users=["Master","paopao","mary","Alice","jack"] new_users=["mack","tom","Mary","alice","james"] current_users_1=[] for oldname in current_users: oldname=oldname.lower() current_users_1.append(oldname) for newname in new_users: if newname.lower() in current_users_1: print(newname,"你好,你注册的名字已被占用,请重新注册。") else: print(newname,"你好,你注册的名字可用。")
输出结果:
mack 你好,你注册的名字可用。
tom 你好,你注册的名字可用。
Mary 你好,你注册的名字已被占用,请重新注册。
alice 你好,你注册的名字已被占用,请重新注册。
james 你好,你注册的名字可用
如果有对本段代码不懂的同学,可以亲自来问我。当然,有更好优化代码方案的,请务必告诉我。
一个简单的字典示例
student={"name":"master","age":18} print(student["name"]) print(student["age"])
字典student存储了一个学生的名字和年龄,使用print()来打印结果,会看见:
master
18
字典的概念
在python中,字典是一系列的键-值对,每一个键都与一个值相对应,使用的符号是大括号{ }。
你可以使用键来访问与之相对应的值,与键相关联的值可以是数字、字符串、列表乃至字典。
字典dict的公式:{key1:value1,key2:value2,...}
键和值之间用冒号分隔,键-值对与键值对用逗号隔开。
创建字典并学会如何访问值
我们来创造一个包含更多学生信息的字典:
student={ "name":"master", "age":18, "sex":"男", "class":"软件一班", "teacher":"Mr.Lee" }
我们知道,去使用键来访问值:
#获取学生的名字 print(student["name"]) #获取学生的性别 print(student["sex"]) #获取学生的班级 print(student["class"])
可以看到结果如下所示:
master
男
软件一班
添加新的键-值对和修改键的值
首先复习一下列表如果想要添加新的元素的时候,有哪几种方法:
list_1.append() :末尾追加一个新的元素
list_1.insert():某索引位置加入新的元素
小提示:为什么不直接命名list?--->关键词不能用来做变量名
字典添加新的键-值对相对于列表是非常方便的:
student["school"]="哈佛大学" student["address"]="热河路"
然后我们print(student)来看看字典发生了怎么样的变化:
{ 'name': 'master', 'age': 18, 'sex': '男', 'class': '软件一班', 'teacher': 'Mr.Lee', 'school': '哈佛大学', 'address': '热河路' }
是不是非常快速多了,只需要给字典的索引上创一个新的键,等于号后面写上所对应的值,就可以产生新的键-值对了。
那么实际上我这个student字典非常不贴实际的,存在吹牛逼的成分,master考上哈佛大学,有那么牛逼吗?
那么如何修改字典里面的值呢?
student["age"]=20 student["school"]="野鸡大学" print(student)
我们可以发现,字典修改值和列表修改元素的方法都一样,给指定索引重新定义数据就可以完成修改:
{ 'name': 'master', 'age': 20, 'sex': '男', 'class': '软件一班', 'teacher': 'Mr.Lee', 'school': '野鸡大学', 'address': '热河路' }
现在这个student字典里的信息是不是看上去顺眼多了?
删除键-值对
我们在上面使用student字典的过程中,键"teacher":值"Mr.Lee"这一对并没有用过。
所以,我们就考虑删除掉这一对,删除的方法使用del:
del student["teacher"] print(student)
删除的方法,字典和列表也一样,用del删除指定的键,就能删除掉键-值对,不再出现。
{ 'name': 'master', 'age': 20, 'sex': '男', 'class': '软件一班', 'school': '野鸡大学', 'address': '热河路' }
使用for遍历字典
①遍历所有的键-值对
首先有student字典:
{
'name': 'master', 'age': 20, 'sex': '男', 'class': '软件一班', 'school': '野鸡大学', 'address': '热河路' }
如何将这些数据更为直观的键-值打印在窗口上:
for key,value in student.items(): print("键:",key) print("值:",value) print()
要注意的是,字典并不能直接与for相结合使用:
这时,items()应运而生,它的作用是把字典转换为列表形式,键-值对转换为元组。
dict_items([('name', 'master'), ('age', 20), ('sex', '男'), ('class', '软件一班'), ('school', '野鸡大学'), ('address', '热河路')])
输出结果:
键: name
值: master
键: age
值: 20
键: sex
值: 男
键: class
值: 软件一班
键: school
值: 野鸡大学
键: address
值: 热河路
②遍历字典中的所有键
在这儿,我们要重新定义一个字典,来帮助你完成更好理解这个小节:
一个学生字典,学生名字为键,年龄为值
student={ "张三":18, "李四":20, "王五":22, "马六":23 }
现在,我要遍历出这个字典的所有人的名字:
for name in student.keys(): print(name)
keys()方法极为有用,也不需要经过一些复杂的转换列表操作,可以直接提取出所有的键。
输出结果:
张三
李四
王五
马六
③遍历字典中的所有值
和上面方法一样,直接使用values方法提取所有的值。
for name in student.values(): print(name)
输出结果:
18
20
22
23
字典的嵌套用法
①列表存储字典元素
我们创建三个学生信息的字典,含有姓名和年龄:
student1={"name":"张三","age":18} student2={"name":"李四","age":19} student3={"name":"王五","age":20}
然后,我们可以把这三个字典,存储到列表里作为元素:
student_list=[student1,student2,student3] print(student_list)
输出结果:
[{'name': '张三', 'age': 18}, {'name': '李四', 'age': 19}, {'name': '王五', 'age': 20}]
②字典存储列表值
我在上面提过一句话:
你可以使用键来访问与之相对应的值,与键相关联的值可以是数字、字符串、列表乃至字典。
在上面我们已经见识了数字和字符串类型作为值,现在来看一看列表作为值的情况:
在上面中,我们认识了张三,李四和王五,现在调查他们的爱好,得到下面的结果
张三的爱好:编程,游泳和打游戏
李四的爱好:编程,看书和踢足球
王五的爱好:撩妹,喝酒和打游戏
然后,他们都是来自软件一班,就用appclass_one作为字典变量,
他们的名字作为键,他们的爱好作为值并用列表的形式:
appclass_one={ "张三":["编程","游泳","打游戏"], "李四":["编程","看书","踢足球"], "王五":["撩妹","喝酒","打游戏"] }
现在,我们将这个字典数据以更为直观的形式出现在打印窗口:
for people,favourites in appclass_one.items(): print(people+"的爱好如下:") for favourite in favourites: print("\t",favourite) print()
先来看看输出结果:
张三的爱好如下:
编程
游泳
打游戏
李四的爱好如下:
编程
看书
踢足球
王五的爱好如下:
撩妹
喝酒
打游戏
那么要考虑到一些零基础的同学,可能会一时无法理解代码的原理,我可以给出大概的解释如下:
第一行肯定是先提取出键和值出来,items()是转换成列表形式,
缩进之后来到第二行,打印出人名的爱好消息,这时候如果来到第三行直接打印,
第三行直接是一行列表形式的爱好,肯定不够直观,而且我不想要看见列表的符号,
所以再对这个列表进行提取每个元素处理,把每个元素但独占一行,
“\t”是横向制表符,也就是制造横向空格,让整体效果更为直观。
最后一行的print()属于换行,然后继续访问字典里第二个人名……
③字典存储字典值
字典的值也可以是字典的形式,比如定义一个班级字典,里面有很多学生的信息:
appclass_one={ "student1":{"name":"张三","age":18}, "student2":{"name":"李四","age":19}, "student3":{"name":"王五","age":20} }
如果想像上面一样出题目的话,其实也不用浪费笔墨,多用一次items()方法即可。
作业来袭:
创建一个名为cities的字典,其中将三个城市名用作键,对于每个城市的所属省份、人口数、是否为省会等等创建一个字典作为值。
然后以更为直观的形式打印出这些信息在输出窗口。
恭喜你!字典在你面前成功地做了弟弟,接下来的一篇博客你将接触到while循环和input获取用户输入。
建议再次复习往期博客加强复习!