字典是python中唯一的映射类型,采用键值对(key-value)的形式存储数据
------------ 完美的分割线 -------------
1.字典引入
# 为何还要用字典?
存放一个人的信息:姓名,性别,年龄,很明显是多个值,既然是存多个值,就可以用列表去存放
但是定义列表的目的不单单是为了存,更重要的是要考虑取值
info=['xiaoming','male',18] info[2]
以上这种方法是基于我们已经知道在第3个位置存放的是年龄的前提下取出的
而这完全只是一种假设,并没有真正意义上规定第三个位置存放的是年龄,于是我们需要寻求一种,即可以存放多个任意类型的值,又可以硬性规定值的映射关系的类型,比如key=value,这就用到了字典
字典(dictionary)是除列表以外python之中最灵活的内置数据结构类型。
2.字典的特性:
1)字典是python中唯一的映射类型,采用键值对(key-value)的形式存储数据
2)字典是无序的但key键必须唯一且可hash,也就是必须为不可变的数据类型(字符串,元组等)
python对key进行哈希函数运算,根据计算的结果确定value的存储地址,所以字典是无序存储的,且key必须是可哈希的
3)字典的value值可以存放任意多个,可修改,可以不唯一
4)查找速度快,通过hash函数转换为数字(散列值),对之排序后用二分法查找,详细可以查询算法
5)列表是有序的对象结合,字典是无序的对象集合
两者之间的区别在于:字典当中的元素是通过键来存取的,而不是通过偏移存取。
3.字典的操作
3.1.创建字典:
语法:
dic1 = {"name": "xiaoming", 'age': 18} print(dic1)
或
dic2 = dict((('name','alex'),)) dic2 = dict([('name','alex'),('age','18')]) # 键值对以列表或元组表示dic2 = dict([['name','alex'],('age','18')]) print(dic2) # 输出结果相同
3.2.在字典中取值(查询)
1)dic3.get()方法查找字典中的值
推荐使用get方法取字典的值,而不是通过key直接取值
dic3 = { 'stu01': "xiaozhao", 'stu02': "laoli", 'stu03': "dahuang", } print(dic3['stu01']) # 直接查询stu01,key存在正常返回 --->'xiaoming' print(dic3['stu05']) # 如果key不存在就报错,不建议使用 Traceback (most recent call last): File "<input>", line 1, in <module> KeyError: 'stu05' ---------------------- print(dic3.get('stu01')) # key存在正常返回 --->xiaozhao print(dic3.get('stu05')) # key不存在,返回none,建议使用 --->None
总结:
直接查找字典,如果键值对不存在就会报错,所以推荐使用.get()方法
2)dic3.keys()方法查询字典中所有的键
print(dic3.keys()) # 打印字典中所有的键,存为一个列表 --->dict_keys(['stu01', 'stu02', 'stu03']) print(list(dic3.keys())) # 将字典中的所有keys转换为一个列表 --->['stu01', 'stu02', 'stu03']
3)dic3.values()方法查询字典中所有的值
print(dic3.values()) # 打印字典中的所有值,存为列表 --->dict_values(['xiaozhao', 'laoli', 'dahuang']) print(list(dic3.values())) # 将字典中的values值转换为一个列表 --->['dahuang', 'laoli', 'xiaozhao']
4)dic3.items()方法查询字典中的键值对
print(dic3.items()) # 把所有键值对以元组的方式存为列表 --->dict_items([('stu01', 'xiaozhao'), ('stu02', 'laoli'), ('stu03', 'dahuang')]) print(list(dic3.items())) # 把字典中的所有键值对以元组的方式转换为一个列表 --->[('stu01', 'xiaozhao'), ('stu02', 'laoli'), ('stu03', 'dahuang')]
3.3.向字典中增加数据
dic3['stu04'] = 'Lisa' print(dic3) --->{'stu01': 'xiaozhao', 'stu02': 'laoli', 'stu03': 'dahuang', 'stu04': 'Lisa'}
3.4.修改字典中的数据
dic3['stu03'] = 'XiaoMing' print(dic3) --->{'stu01': 'xiaozhao', 'stu02': 'laoli', 'stu03': 'XiaoMing', 'stu04': 'Lisa'}
3.5.判断字典中的某个key是否存在
print('stu01' in dic3) --->True
3.6.删除字典中的某些数据
1)dic3.pop()方法删除指定的key
删除指定的key,并返回被删除的key的value,不指定key,默认随机删除一个
print(dic3.pop('stu01')) print(dic5) --->xiaozhao --->{'stu02': 'laoli', 'stu03': 'XiaoMing', 'stu04': 'Lisa'}
2)dic3.popitem()方法随机删除一个键值对
随机删除一个,并以元组的方式返回被删除的key的value,不建议使用
print(dic3.popitem()) print(dic3) --->('stu03', 'dahuang') --->{'stu01': 'xiaozhao', 'stu02': 'laoli'}
3)del方法删除字典或者某个键值对
删除指定的key,不返回数据
#del dic3 # 删除整个字典 del dic3['stu02'] # 删除指定键值对 print(dic3) --->{'stu01': 'xiaozhao', 'stu03': 'dahuang'}
4)dic3.clear()方法清空字典内容
返回None
print(dic3.clear()) --->None print(dic3) --->{}
3.7.dic1.update()方法
扩展更新,字典相加,有相同key覆盖,没有的key就增加
dic1={1:2,2:3,3:4,4:5} dic2={1:'xiaoming','name':'laowang'} dic1.update(dic2) print(dic1) --->{1: 'xiaoming', 2: 3, 3: 4, 4: 5, 'name': 'laowang'}
3.8.dic1.setdefault()方法设置默认值
1)键存在,不改动,返回键对应的值
ret = dic1.setdefault(1,34) print(ret) --->xiaoming
2)键不存在,在字典中增加新的键值对,并返回相应key的值
ret = dic1.setdefault('hobby','girl') print(dic1) print(ret)
3.9.fromkeys()方法批量设置默认值
创建一个字典,批量设置默认值,有个无法解释的坑,少用
使用场景:生成一个新员工的字典
dic3 = {1:2} dic4 = dic3.fromkeys(['A','B','C'],'xiaoli') # 前面的作为新字典的键key,后面的作为新字典各个key的值value print(dic4) --->{'A': 'xiaoli', 'B': 'xiaoli', 'C': 'xiaoli'}
4.字典的循环打印
4.1.循环方法1:键值对打印
dic1={1:2,2:3,3:4,4:5} for k in dic1: print(k,dic1[k])
返回结果:
1 2 2 3 3 4 4 5
4.2.循环方法2:转换成列表进行赋值
很低效,不推荐使用
dic1={1:2,2:3,3:4,4:5} for k,v in dic1.items(): print(k,v)
返回结果同上
5.多级字典嵌套
5.1.什么是多级字典嵌套?
类似以下这种:
menu = { "火车":{"河南省": {"郑州站":{},"漯河站":{},"信阳站":{}}, "湖北省": {"武汉站":{},"武昌站":{}}}, "地铁":{"线路11": {"李子园":{},"曹杨路":{},"江苏路":{}}, "线路9": {"徐家汇":{},"松江新城":{},"九亭":{}}}, "公交":{"1223": {'荣和怡景园':{},'自来水厂':{},'大渡口':{}}, "嘉定区间": {'乐购':{},'新玛特':{},'家乐福':{}}} }
5.2.多级字典嵌套的应用:三级菜单
开发环境:
win10,python3.6.2,pycharm
开发需求:
1. 运行程序打印第一级菜单 2. 选择进入第一级菜单,打印第二级菜单,同理打印第三级菜单 3. 可以返回上一级菜单 4. 可以在任意位置退出程序 5. 菜单数据最好可以保存在文件中
程序代码:
1 flag = True 2 while flag: #全局变量,设置跳出整个循环 3 for i in menu: #遍历第一层字典 4 print(i) 5 num_1 = input("请选择>:") 6 # print(menu.keys()) 7 if num_1 in menu.keys(): 8 while flag: 9 for i in menu[num_1]: 10 print(i) 11 num_2 = input("请选择>>:") 12 if num_2 in menu[num_1]: 13 while flag: 14 for i in menu[num_1][num_2]: 15 print(i) 16 num_3 = input("请选择>>>:") 17 if num_3 in menu[num_1][num_2]: 18 print(num_3,'this is you input') 19 elif num_3 == 'b': 20 break 21 else: 22 continue 23 elif num_2 == 'b': 24 break 25 else: 26 continue 27 elif num_1=="b": 28 exit() 29 else: 30 continue
1 level =[] 2 while True: 3 for key in menu: 4 print(key) 5 your_choice = input("your choice >>:").strip() 6 if your_choice == "b": 7 if len(level)==0:break # 当列表空的时候,就是退出大循环的时候 8 menu=level[-1] 9 level.pop() # 删除列表最后一个元素 10 print(level) 11 # break 12 elif your_choice in menu: 13 # print(menu) 14 level.append(menu) 15 # print(level) 16 menu=menu[your_choice] 17 else: 18 continue
---------------- 完毕,呵呵呵呵 ---------------------