字典介绍
python内置字典:dict,在其他语言中也称map;
使用键值存储,具有极快的查找速度;
键值对作为元素,字典中可以包含多个键值对,键和值的类型不做限制;
键不能重复,如果相同则会覆盖,值可以重复;
字典是无序的,因此不能通过下标的方式来操作;
In [1]: stus={"name":"zyj","score":100} #创建一个字典 In [2]: stus Out[2]: {'name': 'zyj', 'score': 100} In [10]: stus["name"]="sl" #键不能重复,相当与修改之前键对应的值 In [11]: stus Out[11]: {'name': 'sl', 'score': 100} In [3]: stus[1] #不支持下标的方式查找 --------------------------------------------------------------------------- KeyError Traceback (most recent call last) <ipython-input-3-9b18ab9e3e1b> in <module>() ----> 1 stus[1] KeyError: 1 In [4]: stus["name"] #根据键去查找对应的值 Out[4]: 'zyj' In [5]: stus["sex"] #查找的键不存在时会报错 --------------------------------------------------------------------------- KeyError Traceback (most recent call last) <ipython-input-5-92cfcdd3fb2f> in <module>() ----> 1 stus["sex"] KeyError: 'sex' In [6]: stus.get("name") #可以使用get方法查找键对应的值 Out[6]: 'zyj' In [7]: stus.get("address") #get方法查找不存在的键时不会报错,返回None In [8]: In [8]: address=stus.get("address") In [9]: In [9]: type(address) Out[9]: NoneType #返回的类型 In [10]:
常用操作:增删改查
In [12]: stus Out[12]: {'name': 'sl', 'score': 100} In [13]: stus["sex"]="gril" #键不存时就是增加 In [14]: stus Out[14]: {'name': 'sl', 'score': 100, 'sex': 'gril'} In [15]: stus["sex"]="boy" #键存在时就是修改键对应的值 In [16]: stus Out[16]: {'name': 'sl', 'score': 100, 'sex': 'boy'} In [18]: "name" in stus #判断键是否在字典中存在,而不是判断值 Out[18]: True In [19]: "sl" in stus Out[19]: False In [20]: stus["name"] #如果有返回,则说明存在 Out[20]: 'sl' In [21]: stus["add"] #如果返回报错,说明不存在 --------------------------------------------------------------------------- KeyError Traceback (most recent call last) <ipython-input-21-ced6c0266c9b> in <module>() ----> 1 stus["add"] KeyError: 'add' In [22]: del stus["sex"] #删除其中的一个键值对 In [23]: stus Out[23]: {'name': 'sl', 'score': 100} In [24]: del stus #直接删除字典 也可以用clear清空字典,但是它不会回收内存 In [25]: stus --------------------------------------------------------------------------- NameError Traceback (most recent call last) <ipython-input-25-44d38c6a3442> in <module>() ----> 1 stus NameError: name 'stus' is not defined
字典中常见的函数
In [1]: names={"name":"zyj","age":18,"sex":"gril"} In [2]: len(names) #返回字典的长度 Out[2]: 3 In [6]: names.keys() #获取每个元素的键,作为列表输出 Out[6]: dict_keys(['name', 'age', 'sex']) In [7]: names.values() #获取每个元素的值, Out[7]: dict_values(['zyj', 18, 'gril']) In [9]: for i in names.keys(): ...: print(i) ...: name age sex In [10]: for i in names.values(): ...: print(i) ...: zyj 18 gril In [11]: for item in names.items(): #获取所有的元素,返回的是元组。 ...: print(item) ...: ('name', 'zyj') ('age', 18) ('sex', 'gril') #字典的迭代输出。 In [12]: for item in names.items(): ...: print("key:%s,value:%s"%item) #字典的格式化输出,item本身就是元组,以前两个占位符的时候编写为%(a,b)也是元组。 ...: key:name,value:zyj key:age,value:18 key:sex,value:gril In [15]: names Out[15]: {'name': 'zyj', 'age': 18, 'sex': 'gril'} In [16]: key="sex" In [19]: if names.has_key(key): #python3中不支持了,使用的比较少,一般使用in,has_key()返回布尔值,因此可以在if语句中作为条件使用 ...: print("%在字典中"%key) ...: --------------------------------------------------------------------------- AttributeError Traceback (most recent call last) <ipython-input-19-d7d5c595d57c> in <module>() ----> 1 if names.has_key(key): 2 print("%在字典中"%key) 3 AttributeError: 'dict' object has no attribute 'has_key' In [17]: if key in names: ...: print("%s在字典中"%key) ...: sex在字典中
集合迭代输出补充:内置函数enumerate枚举,
第一种:
1 names=["zyj","sl","zs","ls"] 2 names2=("zyj","sl","zs","ls") 3 j=0 4 print("number name") 5 for i in names: 6 j+=1 7 print("%d %s"%(j,i)) [root@localhost python]# python3 22.py number name 1 zyj 2 sl 3 zs 4 ls
第二种:
9 for i,item in enumerate(names): 10 print("%d %s"%(i,item))
[root@localhost python]# python3 22.py 0 zyj 1 sl 2 zs 3 ls
序号从1开始:
9 for i,item in enumerate(names,1): #enumerate枚举,内置函数。 10 print("%d %s"%(i,item)) [root@localhost python]# python3 22.py 1 zyj 2 sl 3 zs 4 ls [root@localhost python]#
案例:学生管理案例升级版
print("="*50) print("学生名字管理系统".center(50)) print("输出1:添加学生") print("输出2:查找学生") print("输出3:修改学生") print("输出4:删除学生") print("输出5:查看所有学生") print("输出6:退出") #一个学生包含多个信息,一个学生一个字典,学生列表用列表来存储 stus=[] while True: operate=input("请输入你想要的操作:") if operate=="1": name=input("请输入学生姓名:") age=int(input("请输入学生年龄:")) qq=input("请输入学生qq:") #一个学生包含三个信息,三个信息保存在一个字典中 stu={}#申请一个字典变量 stu["name"]=name #往字典变量中添加一个元素 stu["age"]=age #往字典变量中添加一个元素 stu["qq"]=qq #往字典变量中添加一个元素 stus.append(stu)#stus自动会追加改变 print(stus) if operate=="2": name=input("请输入要查找的学生姓名:") for item in stus: if item["name"]==name.strip():#判断字典中包含该学生的姓名 print("%s 学生存在,年龄为:%s,QQ为:%s"%(item["name"],item["age"],item["qq"])) break#找到后则整个循环终止,不会执行后面的else,全部循环执行完没有找到,才会执行else打印学生不存在 else:#else与for对齐,因为要找到所有字典才能算找完,而不能与if对其,因为if执行一次只查找了一个字典,不能说明问题。 print("学生%s没有找到"%name) if operate=="3": name=input("请输入你要修改的学生姓名:") for item in stus: if item["name"]==name.strip(): item["name"]=input("请输入修改后的姓名:") item["age"]=int(input("请输入修改后的年龄")) item["qq"]=input("请输入修改后的qq号:") print("已经修改完成") break else: print("你要修改的学生%s不存在"%name) if operate=="4": name=input("请输入要删除的学生姓名:") for item in stus: if item["name"]==name.strip(): stus.remove(item) print("学生%s已经删除"%name) break else: print("学生%s没有找到"%name) if operate=="5": print("序号 姓名 年龄 QQ号") for i,item in enumerate(stus,1): print("%d %s %s %s"%(i,item["name"],item["age"],item["qq"])) if operate=="6": break ================================================== 学生名字管理系统 输出1:添加学生 输出2:查找学生 输出3:修改学生 输出4:删除学生 输出5:查看所有学生 输出6:退出 请输入你想要的操作:1 请输入学生姓名:zyj 请输入学生年龄:18 请输入学生qq:123333333 请输入你想要的操作:1 请输入学生姓名:sl 请输入学生年龄:19 请输入学生qq:232323232 请输入你想要的操作:5 序号 姓名 年龄 QQ号 1 zyj 18 123333333 2 sl 19 232323232 请输入你想要的操作:2 请输入要查找的学生姓名:sl sl 学生存在,年龄为:19,QQ为:232323232 请输入你想要的操作:2 请输入要查找的学生姓名:ee 学生ee没有找到 请输入你想要的操作:3 请输入你要修改的学生姓名:dd 你要修改的学生dd不存在 请输入你想要的操作:3 请输入你要修改的学生姓名:zyj 请输入修改后的姓名:zhaoyujiao 请输入修改后的年龄18 请输入修改后的qq号:11212121212 已经修改完成 请输入你想要的操作:5 序号 姓名 年龄 QQ号 1 zhaoyujiao 18 11212121212 2 sl 19 232323232 请输入你想要的操作:4 请输入要删除的学生姓名:zh 学生zh没有找到 请输入你想要的操作:4 请输入要删除的学生姓名:zhaoyujiao 学生zhaoyujiao已经删除 请输入你想要的操作:5 序号 姓名 年龄 QQ号 1 sl 19 232323232 请输入你想要的操作:6 [root@localhost python]#