Python 3.x 字典(Dictionary)详解


字典是另一种可变容器模型,且可存储任意类型对象。
字典的每个键值(key=>value)对用冒号(:)分割,每个对之间用逗号(,)分割,整个字典包括在大括号{}中 ,格式如下所示:

dict = {key1 : value1, key2 : value2 }

注:
关于字典的内置函数可以通过python中的help(dict)命令进行查询。


一、创建字典

>>>dict1 = {'001' : 'smile', '002' : 'yanxiao'}

也可以嵌套的创建字典:

>>>dict2 = {'001' : {'name' : 'smile', 'sex' : '女'},
	   	    '002' : {'name' : 'yanxiao', 'sex' : '男'}}

注意:
字典得每一个键和键值之间必须用冒号:隔开,每一对要用逗号,隔开,整体放在大括号{}中;
键必须独一无二,而值则不必,值可以取任何数据类型,但必须是实体,如字符串,数。


二、访问字典内容

这部分内容我个人认为是关于字典的操作里面最为重要的一部分,后续爬虫会用到字典的这部分操作。

1.简单访问

把相应的键放入方括号里,进实例:

>>>dict1 = {'001' : 'smile', '002' : 'yanxiao'}
>>>print("学号为001的学生姓名是:" , dict1['001'])
	#输出结果:学号为001的学生姓名是:smile
>>>dict2 = {'001' : {'name' : 'smile', 'sex' : '女'},
	   	    '002' : {'name' : 'yanxiao', 'sex' : '男'}}
>>>print("学号为001的学生性别是:" , dict2['001']['sex'])
	#输出结果:学号为001的学生性别是:女

如果用字典中没有的键访问数据会出现如下所示错误:

>>>dict1 = {'001' : 'smile', '002' : 'yanxiao'}
>>>print(dict1['003'])
	#输出结果:
	#Traceback (most recent call last):
  	#File "<stdin>", line 1, in <module>
	#KeyError: '003'

2.遍历操作

利用循环for对字典进行遍历操作:

for k in dict遍历字典中全部的键

话不多说,进实例:

>>>dict1 = {'001' : 'smile', '002' : 'yanxiao'}
>>>for k in dict1:
>>>		print(k)
	#输出结果:001
	#		  002
>>>dict2 = {'001' : {'name' : 'smile', 'sex' : '女'},
	   	    '002' : {'name' : 'yanxiao', 'sex' : '男'}}
>>>for k in dict2:
>>>		print(k)
	#输出结果:001
	#		  002

注意:这里对dict2的操作结果依然是001 002,而不是001 002 name...,因为{'name' : 'smile', 'sex' : '女'}{'name' : 'yanxiao', 'sex' : '男'}dict2中的001 002这两个键的键值。
那么,要访问name sex这两个键则需要进参照③中的for k,v in dict.items(),如下实例:

>>>dict2 = {'001' : {'name' : 'smile', 'sex' : '女'},
	   	    '002' : {'name' : 'yanxiao', 'sex' : '男'}}
>>>for k,v in dict2.items():
>>>		for k in v:
>>>			print(k)
	#输出结果:name
	#		  sex
	#		  name
	#		  sex

for v in dict.values()遍历字典中全部的键值

话不多说,我们接着进实例:

>>>dict1 = {'001' : 'smile', '002' : 'yanxiao'}
>>>for v in dict1.values():
>>>		print(v)
	#输出结果:smile
	#		  yanxiao
>>>dict2 = {'001' : {'name' : 'smile', 'sex' : '女'},
	   	    '002' : {'name' : 'yanxiao', 'sex' : '男'}}
>>>for v in dict2.values():
>>>		print(v)
	#输出结果:{'name' : 'smile', 'sex' : '女'}
	#		  {'name' : 'yanxiao', 'sex' : '男'}

相信看到这里,大家就可以理解①中注意那块的内容了,那么问题又来了,有的朋友肯定又要问了“如果我要输出dict2中的smile 女 yanxiao 男,又该怎么做呢?”基地爆炸,问题不大,我们还是得用到③中的for k,v in dict.items(),进实例:

>>>dict2 = {'001' : {'name' : 'smile', 'sex' : '女'},
	   	    '002' : {'name' : 'yanxiao', 'sex' : '男'}}
>>>for k,v in dict2.items():
>>>		for v in v.values():
>>>			print(v)
	#输出结果:smile
	#		  女
	#		  yanxiao
	#		  男

for k,v in dict.items()遍历字典中全部的键值对

话不多说,我们还得进实例:

>>>dict1 = {'001' : 'smile', '002' : 'yanxiao'}
>>>for k,v in dict1.items():
>>>		print(k,v)
	#输出结果:001 smile
	#		  002 yanxiao
>>>dict2 = {'001' : {'name' : 'smile', 'sex' : '女'},
	   	    '002' : {'name' : 'yanxiao', 'sex' : '男'}}
>>>for k,v in dict2.items():
>>>		print(k,v)
	#输出结果:001  {'name' : 'smile', 'sex' : '女'}
	#		  002  {'name' : 'yanxiao', 'sex' : '男'}

那么,看过for k,v in dict.items()的实例,①②中被参照的地方相信大家到这里就都理解了。


三、修改字典内容

1.最基本的修改

字典的修改,直接赋值,进实例:

>>>dict1 = {'001' : 'smile', '002' : 'yanxiao'}
>>>dict1['001'] = 'smiling'
>>>print(dict1)
	#输出结果 {'001' : 'smiling', '002' : 'yanxiao'}
>>>dict2 = {'001' : {'name' : 'smile', 'sex' : '女'},
	   	    '002' : {'name' : 'yanxiao', 'sex' : '男'}}
>>>dict2['001']['name'] = 'smiling'
>>>print(dict2)
	#输出结果:{'001' : {'name' : 'smiling', 'sex' : '女'},
	#   	   '002' : {'name' : 'yanxiao', 'sex' : '男'}}

字典的扩充,直接赋值,进实例:

>>>dict1 = {'001' : 'smile', '002' : 'yanxiao'}
>>>dict1['003'] = 'smiling'
>>>print(dict1) 
	#输出结果:{'001' : 'smile', '002' : 'yanxiao', '003' : 'smiling'}
>>>dict2 = {'001' : {'name' : 'smile', 'sex' : '女'},
	   	    '002' : {'name' : 'yanxiao', 'sex' : '男'}}
>>>dict2['003'] = {'name' : 'smiling', 'sex' : '女'}
>>>print(dict2)
	#输出结果:{'001' : {'name' : 'smile', 'sex' : '女'},
	#   	   '002' : {'name' : 'yanxiao', 'sex' : '男'},
	#   	   '003' : {'name' : 'smiling', 'sex' : '女'}}

2.间接修改键值

注意:字典中的键值是无法修改的。
只能用间接修改的方法,进实例:

>>>dict1 = {'001' : 'smile', '002' : 'yanxiao'}
>>>dict1['003']=dict1.pop('001')
>>>print(dict1)
	#输出结果:{'002' : 'yanxiao', '003' : 'smile'}

其实这里相当于首先调用了字典中的内置函数dict.pop(),给大家分解一下上面的实例,那么,再进实例:

>>>dict1 = {'001' : 'smile', '002' : 'yanxiao'}
>>>print(dict1.pop('001'))
	#输出结果:smile
	#dict.pop()的作用其实是删除掉字典的键并返回该键的键值,故这里的间接修改键的方法其实就是
	#将返回的键值重新赋值给新的键,但是从结果上来看满足我们的要求

四、删除字典内容

删除字典内容可用到delpopclearpopitem命令。
注意:删除掉键,则对应的键值也会被删除

del命令可以删除指定键或者整个字典,进实例:
>>>dict1 = {'001' : 'smile', '002' : 'yanxiao'}
>>>del dict1['002']
>>>print(dict1)
	#输出结果:dict1 = {'001' : 'smile'}
>>>dict1 = {'001' : 'smile', '002' : 'yanxiao'}
>>>del dict1
>>>print(dict1)
	#输出结果:Traceback (most recent call last):
 	#		  File "<stdin>", line 1, in <module>
	#		  NameError: name 'dict1' is not defined   字典不存在
pop命令可以删除一个键并返回键值,进实例:
>>>dict1 = {'001' : 'smile', '002' : 'yanxiao'}
>>>dict1.pop('001')
'smile'
#会返回键值smile,此时在print(dict1)
>>>print(dict1)
	#输出结果:{'002' : 'yanxiao'}
clear命令可以清空字典,进实例:
>>>dict1 = {'001' : 'smile', '002' : 'yanxiao'}
>>>dict1.clear()
>>>print(dict1)
	#输出结果:dict1={}
	#clear只是清空了字典,并没有删除掉字典
popitem命令可以删除一个随机键并返回该键值对(一般会删除字典末尾的键),进实例:
>>>dict1 = {'001' : 'smile', '002' : 'yanxiao'}
>>>dict1.popitem()
('002','yanxiao')
	#会返回键值对('002','yanxiao'),此时print(dict1)
>>>print(dict1)
	#输出结果:{'001' : 'smile'}

五、程序代码

有一个我自己在学习的过程中写的与字典有关的一个学生信息管理系统,配合着下面的代码基本可以掌握字典的基础用法,那就,上代码:


#学生信息管理系统

print("-------学生信息管理系统-------")
print("身份验证:1.管理员;2.学生.(输入0退出)")
sdic={"001":{'age':'20','name':'smile','sex':'男','tel':'132'},
"002":{'age':'21','name':'yan','sex':'女','tel':'186'}}
#print(sdic)
sdic1={"admin":{'user':'admin','password':'123456'},
"guest":{'user':'guest','password':'123456'}}
#print(sdic1)

#print(sdic["001"])
#print(sdic["001"]['age'])

while 1:
    a=input("请选择你的身份:")
    a=int(a)
    if a==0:
        break
    if a==1:
        uname=input("请输入你的用户名:")
        if uname==sdic1["admin"]['user']:
            str1=input("请输入你的密码:")
            if str1==sdic1["admin"]['password']:
                print("具体操作内容:1.查询总信息;2.查询学生信息(输入学号);3.增加学生记录;4.修改学生信息;5.删除学生信息记录;6.退出")
                while 1:
                    b=input("请输入操作内容:")
                    b=int(b)
                    
                    if b==1:
                        print("*****学生信息*****")
                        print("%-7s%-10s%-10s%-10s%-15s" %("学号","姓名","年龄","性别","电话号码"))
                        for k,v in sdic.items():
                            print("%-9s%-13s%-12s%-10s%-15s" %(k,v['name'],v['age'],v['sex'],v['tel']))
                            
                    if b==2:
                        print("*****查询学生信息*****")
                        id=input("请输入要查询学生的学号(例如:001):")
                        if id in sdic:
                            print("%-7s%-10s%-10s%-10s%-15s" %("学号","姓名","年龄","性别","电话号码"))
                            print("%-9s%-13s%-12s%-10s%-15s" %(id,sdic[id]['name'],sdic[id]['age'],sdic[id]['sex'],sdic[id]['tel']))
                        else:
                            print("查无此人!!!")  
                            break
                    
                    if b==3:
                        print("*****请输入要添加的学生信息*****")
                        id=input("学号(例如:001):")
                        name=input("姓名:")
                        age=input("年龄:")
                        sex=input("性别(男/女):")
                        tel=input("电话号码:")
                        sdic[id]={"name":name,"age":age,"sex":sex,"tel":tel}
                        print("一条新的信息增加完成。")
                   
                    if b==4:
                        while 1:
                            print("*****修改学生信息*****")
                            id=input("请输入要修改的学生学号(例如:001)注:输入0退出:")
                            if id==0:
                                break
                            if id in sdic:
                                print("请选择要修改的内容:1.姓名;2.年龄;3.性别;4.电话号码;5.退出")
                            else:
                                print("该生不存在!")
                                break
                            while 1:
                                d=input("请选择:")
                                d=int(d)
                                if d==1:
                                    name=input("请输入修改后姓名:")
                                    sdic[id]={"name":name,"age":sdic[id]['age'],"sex":sdic[id]['sex'],"tel":sdic[id]['tel']}
                                if d==2:
                                    age=input("请输入修改后年龄:")
                                    sdic[id]={"name":sdic[id]['name'],"age":age,"sex":sdic[id]['sex'],"tel":sdic[id]['tel']}
                                if d==3:
                                    sex=input("请输入修改后性别(男/女):")
                                    sdic[id]={"name":sdic[id]['name'],"age":sdic[id]['age'],"sex":sex,"tel":sdic[id]['tel']}
                                if d==4:
                                    tel=input("请输入修改后电话号码:")
                                    sdic[id]={"name":sdic[id]['name'],"age":sdic[id]['age'],"sex":sdic[id]['sex'],"tel":tel}
                                if d==5:
                                    break
                    if b==5:
                        print("*****删除学生信息记录*****")
                        id=input("请选择要删除的学生学号:")
                        if id in sdic:
                            del sdic[id]
                            print("该生信息已删除。")
                        else:
                            print("该生不存在!!!")
                    if b==6:
                        break
            else:
                print("用户验证错误!!!")
                
        else:
            print("用户权限等级不够!!!")
            break
    if a==2:
        print("具体操作内容:1.查询学生信息(输入学号);2.退出")
        while 1:
            c=input("请输入操作内容:")
            c=int(c)
            if c==1:
                id=input("请输入要查询学生的学号(例如:001):")
                if id in sdic:
                    print("%-7s%-10s%-10s%-10s%-15s" %("学号","姓名","年龄","性别","电话号码"))
                    print("%-9s%-13s%-12s%-10s%-15s" %(id,sdic[id]['name'],sdic[id]['age'],sdic[id]['sex'],sdic[id]['tel']))  
                else:
                    print("查无此人!!!")  
            if c==2:
                break
        

六、桃花依旧笑春风

emmmmmm,为什么写这篇博客呢,因为最近在写一个小小的爬虫,中间用到字典的部分比较多,奈何自己对这部分只是不是很娴熟,于是乎呢就各种找资料,然后就发现没有很系统的讲字典操作的,都是很零散,尤其是对字典遍历这一块,并且这一段还蛮重要的个人感觉哦,然后就结合自己所学的和网上各位大佬的资料总结了一下下,以便于以后自己再用到的话就不用满世界去找资料了,总结的不到位的地方还望csdn各位前辈指点,嘿嘿。
最后呢,愿自己也愿诸君一路山程水更都明媚如三月暖阳!!!


邮箱:
renbo_smiling@163.com

  • 6
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值