内容概要
1. 什么是字典
字典是以key:value的形式来保存数据
用{}表示. 存储的是key:value
1 # lst = ["周杰伦", "林俊杰", "蔡依林"] 2 # lst[0] 3 # lst[0] = "麻花藤" 4 # 查找的效率比较高 5 # 坑: 字典存储数据的时候是用的hash值来存储. 哈希是一个算法,不能变的(python内置的) 6 # 数据必须是不可变的(可哈希). 字典的key必须是可哈希的(不可变). 7 # dic = {"jay":"周杰伦", "jj": "林俊杰", "jolin":"蔡依林"} 8 # print(dic['jay']) # 周杰伦 9 # dic['jay'] = "麻花藤" 10 # 11 # print(type(dic)) # <class 'dict'> 12 13 # 列表是可变的. 不可哈希 14 # 元组是不可变的. 可哈希的 15 # print(hash((1,2,3))) # unhashable type: 'list' 16 # unhashable type: 'list' 17 # dic = {"jay":"周杰伦", "王力宏":["龙的传人", "唯一", "改变自己"], ["战狼", "战狼2"]: "武警"} 18 # print(dic)
2. 字典的增删改查(重点)
1. 添加
dic[新key] = 值
setdefault(key,value) key不存在,添加键值对
2. 删除
pop(key) 删除指定键的键值对
## dic.popitem() # 随机删除一项(现在的版本一般是弹出最后一项)
##del dic["李安"]
##dic.clear() # 清空
3. 修改
dic[老key] = (新)值
update() 更新字典(迭代更新,类似于列表的 extend)
4. 查询
dic[key] ##直接使用key就可以拿到value
get(key, 值) ##当key不存在. 返回第二个参数. 默认第二个参数是None
setdefault(key, value) key存在,返回对应的 value,key 不存在,先新增,再返回对应的 value
5. 遍历,字典是一个可迭代对象
1 # dic = {"意大利": "李云龙", "美国": "美国往事"} 2 # 3 4 #增 5 # # dic["日本"] = "东京审判" # 新key表示添加 6 # # dic['韩国'] = "釜山行" 7 # 8 # # setdefault (难点) 9 # # 有添加的功能,如果key是存在的. 不添加 10 # # 流程: 判断你给的key是否在字典中存在了.如果已经存在了. 就不再新增. 如果不存在. 执行新增操作 11 # dic.setdefault("美国", "三傻大闹宝莱坞") 12 # print(dic) 13 14 15 #删 16 # dic = {"张艺谋":"红高粱", "李安":"断臂山", "陈凯歌":"霸王别姬", "郭德纲":"祖宗十九代"} 17 # # dic.pop("郭德纲") # 你要记住的 18 # # dic.popitem() # 随机删除一项. 在python早期版本 字典是无序的.##现在是有序的(输出在屏幕上的显示是有序的,底层还是无序的),所以一般删除的是最后一项 19 # del dic["李安"] 20 # dic.clear() # 清空 21 # print(dic) 22 23 24 #改 25 # dic = {"河南":"胡辣汤", "开封": "灌汤包", "武汉":"热干面"} 26 # # dic['河南'] = "烩面" # 老key = 新值 27 # print(dic) 28 29 # dic1 = {"赵四":"刘晓光", "刘能":"王晓利", "王木生":"范伟"} 30 # dic2 = {"赵四":"宝宝", "刘能":"萌萌", "皮校长":"皮长山"} 31 ##迭代更新 32 # dic1.update(dic2) # 把dic2怼到dic1里面. 把dict2中的内容更新到dic1 33 # print(dic1) 34 # print(dic2) 35 36 37 #查 38 dic1 = {"赵四":"刘晓光", "刘能":"王晓利", "王木生":"范伟"} 39 40 # 1. 直接使用key就可以拿到value 41 # print(dic1["赵四四"]) # KeyError: '赵四四' key不存在 42 43 44 # 2. get(key) 45 # print(dic1.get("刘能能")) # None 当key不存在返回None 46 # print(dic1.get("刘能能", "没有这个人")) # 当key不存在. 返回第二个参数. 默认第二个参数是None 47 48 # 3. setdefault() 第一个功能是添加(当key不存在). 第二个功能是查询(根据你给的key查询) 49 # 整个执行流程: 判断给的key是否存在. 如果存在. 就不执行新增流程.直接查询出这个key对应的value 50 # 如果key不存在. 先执行新增操作. 再使用key把对应的value查询出来 51 # ##这里是与 get(key,value)的区别,当 key不存在的时候,get不执行新增操作,直接返回你给定的 value 值,而 setdefault 先执行新增,再执行查询操作 52 # ret = dic1.setdefault("皮长山", "皮校长") 53 # print(ret) # 皮校长 54 55 # ret = dic1.setdefault("王木生", "宝宝") 56 # print(ret) # 范伟
1 # dic = {"赵四":"刘晓光", "刘能":"王晓利", "王木生":"范伟"} 2 # 直接for循环 3 # for key in dic: # 直接循环字典拿到的是key, 有key直接拿value 4 # print(key) 5 # print(dic[key]) 6 7 # dic = {"赵四":"刘晓光", "刘能":"王晓利", "王木生":"范伟"} 8 9 # 不常用的 10 # print(dic.keys()) # dict_keys(['赵四', '刘能', '王木生']) 像列表. 山寨列表 11 # for k in dic.keys(): # 拿到的是字典中的每一个key 12 # print(k) 13 14 # 当需要单独获取到所有value的时候 15 # print(dic.values()) # dict_values(['刘晓光', '王晓利', '范伟']) 所有的value的一个数据集 16 # for v in dic.values(): 17 # print(v) 18 19 # print(dic.items()) # 所有的键值对 dict_items([('赵四', '刘晓光'), ('刘能', '王晓利'), ('王木生', '范伟')]) 20 # for k, v in dic.items(): # 遍历字典最简单的方案##这里涉及到一个自动解构的过程 21 # # print(item) # ('赵四', '刘晓光') 22 # # k, v = item # 解构,##item 是一个中间变量,可以直接省略掉 23 # # k = item[0] 24 # # v = item[1] 25 # print(k, v) 26 27 28 # a, b = 1, 2, 3 # 把后面的两个值分别赋值给前面两个变量. 解构, 解包 29 # print(a) 30 # print(b) 31 32 33 ''' 老师课上讲解的总结: 34 ------------------------------------------------------------------------ 35 # a,b = 1,2 #解构必须前后数量相等,不等会报错 36 # a,b = (1,2) 37 # (a,b) = (1,2)#上面的三种写法是等价的,#元组的括号可以不加,只要有逗号就是元组类型的 38 # print(a) 39 # print(b) 40 41 #元组的括号可以不加,只要有逗号就是元组类型的 42 # a = 1 43 # print(type(a)) #<class 'int'> 44 # a = 1, 45 # print(type(a)) #<class 'tuple'> 46 # a = (1,) 47 # print(type(a))#<class 'tuple'> 48 ------------------------------------------------------------------------- 49 ''' 50 # c = 1,2,3 51 # print(c) # (1, 2, 3) # 元组和列表是可以解包的 52 53 # d, e, f = [1,2,3] 54 # print(d) 55 # print(e) 56 # print(f) 57 58 59 # 遍历字典两套方案(最常用的,需要记忆的) 60 dic = {"赵四":"刘晓光", "刘能":"王晓利", "王木生":"范伟"} 61 # 1. 使用for循环直接遍历字典的key 62 # for key in dic: 63 # print(key) 64 # print(dic[key]) 65 66 # 2. 可以使用字典的items()+解构可以直接获取到key和value 67 # for k, v in dic.items(): 68 # print(k) 69 # print(v)
3. 字典的相关操作
1. keys() 获取到所有的键
2. values() 获取到所有的值
3. items() 拿到所有的键值对
4. 字典的嵌套
字典的嵌套. 字典套字典
1 wf = { 2 "name":"汪峰", 3 "age":52, 4 "hobby":["唱歌", "上头条", "穿皮裤"], 5 "wife": { 6 "name": "章子怡", 7 "age": 49, 8 "hobby":["演戏", "上电视", "当导师"], 9 "tishen": { 10 "name":"萌萌", 11 "age":28 12 }, 13 "zhuli":{ 14 "name":"磊磊", 15 "age": 20 16 } 17 }, 18 "zhuli":{ 19 "name":"宝宝", 20 "age":23, 21 "hobby":["抽烟","喝酒","烫头"] 22 }, 23 "children":[{"name":"汪老大"}, {"name":"汪老二"}] 24 } 25 # wf['children'][1]["age"] = 2 26 # print(wf) 27 # # print(wf['zhuli']['name']) 28 # 29 # # 汪峰老婆替身的名字 30 # print(wf['wife']['tishen']['name']) 31 # # 汪峰老婆的第二个爱好 32 # print(wf['wife']['hobby'][1]) 33 # # 汪峰助理的第三个爱好 34 # print(wf['zhuli']['hobby'][2]) 35 # 36 # 37 # # 汪峰的助理+10岁 38 # wf['zhuli']['age'] = wf['zhuli']['age'] + 10 39 # # 汪峰的老婆添加一个爱好("导戏") 40 # wf['wife']['hobby'].append("导戏") # 添加完毕了 41 # # 删除汪峰助理的"抽烟"爱好 42 # wf["zhuli"]["hobby"].remove("抽烟") 43 # print(wf)
5. 集合(不重要). 去重复
集合中的元素是不重复的,必须是可哈希的(不可变), 相当于字典中的key(集合本身是可变的,但是它要求它内部的值是不可变的)
空集合:set()
空元组:tuple()
空列表:list()
非空集合: {123}集合, 集合其实就是不存value的字典(字典也是可变的,但是它要求他内部的 key 是不可变的)
1 # s = {"周润发", "大润发", "王润发", "周润发"} # 不重复的 2 # print(s) 3 4 # # 唯一能用到的点. 去重复(使用强制类型转化的办法:列表-->集合(去除重复的元素)-->列表) 5 # lst = ["麻将", "牌九", "骰子", "扑克", "老虎鸡", "骰子", "扑克", "老虎鸡", "扑克", "老虎鸡", "扑克", "老虎鸡"] 6 # 7 # # 把列表转化成集合 x 转化成y类型 y() 8 # s = set(lst) 9 # # print(s) 10 # # 把集合变回列表 11 # lst = list(s) 12 # print(lst) # 顺序是乱的(唯一的缺点,但是功(去重复)大于过.排序和去重复都是相当麻烦的一件事) 13 14 ##增 15 # s = {"刘嘉玲", "赵本山", "莱昂纳多迪卡普里奥", "罗纳尔多"} 16 # s.add("刘嘉玲") # 记忆(如果实在是想要记忆的话) 17 # print(s) 18 # 19 # s.update({"刘嘉玲", "刘能", "赵四"}) # 迭代更新 20 # print(s) 21 22 23 ##删 24 # ret = s.pop() # 随机删除(弹出)一个,类似于字典的popitem() 25 # print(s) 26 # print(ret) 27 28 # s.remove("罗纳尔多") 29 # print(s) 30 31 # 集合还有字典. 是没有索引和切片的 32 33 ##改 34 ##set集合中的数据没有索引,也没有办法去定位一个元素,所以没有办法进行直接修改.我们可以采用先删除后添加的方式来完成修改的操作 35 # s = {"刘嘉玲", "赵本山", "莱昂纳多迪卡普里奥", "罗纳尔多"} 36 # 把罗纳尔多修改成梅西 37 # s.remove("罗纳尔多")#先删除 38 # s.add("梅西")#后修改 39 # print(s) 40 41 42 ##查询 43 # 迭代 44 # for el in s: 45 # print(el) 46 47 ##下面是一些不常使用的操作 48 # s1 = {"门神", "灯神", "灯神你在笑什么?"} 49 # s2 = {"门神", "灯神", "你俩在干什么?"} 50 51 # 交集 52 # print(s1 & s2) 53 # print(s1.intersection(s2)) 54 55 # 并集 56 # print(s1 | s2) 57 # print(s1.union(s2)) 58 59 # # 差集 60 # print(s1 - s2) # s1中特有的内容 61 # print(s1.difference(s2)) 62 # 63 # # 反交集 64 # print(s1 ^ s2) # 两个集合中特有的内容 65 # print(s1.symmetric_difference(s2)) 66 67 # 集合本身是可变的数据类型 . 不可哈希 68 # 集合套集合->不能互相嵌套的 69 # 集合中的元素必须可哈希(不可变的) 70 # s = {123} 71 72 # 如果非要集合套集合 73 # s = frozenset({"哈哈","呵呵"}) # 不可变的数据类型(集合) 74 # for el in s: 75 # print(el)
1 # # ##增加 2 # # dic = {'意大利':'李云龙','美国':'美国往事'} 3 # # dic['日本'] = '东京审判' #新 key 表示添加 4 # # dic['日本'] = '东京' #旧key 表示修改 5 # # dic['韩国'] = '釜山行' 6 # # 7 # # #setdefault key 存在就什么都不做,不存在就添加进去 8 # # dic.setdefault('印度','三傻大闹宝莱坞')#注意这里的键值对是以逗号间隔 9 # # 10 # # print(dic) 11 # 12 # 13 # 14 # ##删除 15 # dic = {'张艺谋':'红高粱','李安':'断臂山','陈凯歌':'霸王别姬','郭德纲':'祖宗十九代'} 16 # dic.pop('郭德纲')#需要记忆的 17 # dic.popitem()#随机删除的一项(现在基本是删除末尾的一项) 在 Python 早期版本,字典是无顺序的(界面的展示上是无序的),现在的界面展示是有序的,基本就是你的输入顺序 18 # del dic['李安'] 19 # dic.clear() 20 # 21 # 22 # 23 # print(dic) 24 # 25 # 26 # ##修改 27 # #老 key = 新值 28 # # update 29 # 30 # 31 # 32 # ##查询 33 # dic1 = {'赵四':'刘小光','刘能':'王晓丽','王木生':'范围'} 34 # #直接用下标 key,key 不存在会报错 35 # print(dic1['赵四']) 36 # #直接用get括号内加 key,key 不存在不会报错 37 # print(dic1.get('刘能能')) 38 # print(dic1.get('刘能能','没有这个人')) 39 # 40 # dic1.setdefault('皮厂产','皮校长') 41 # dic1.setdefault('皮厂产','皮屁屁') 42 # 43 # 44 # ##遍历 45 # #直接 for循环遍历 直接拿到的是 key 46 # for key in dic1: #直接循环字典拿到的是 key,有 key 直接拿 value 47 # print(key,dic1[key]) 48 # 49 # #使用 dic.items() 直接拿到k,v 这里有个解构的过程 50 # 这是遍历字典最简单的方法 51 # for k,v in dic.items(): 52 # print(k,v) 53 # 54 # 55 56 57 58 # a,b = 1,2 #解构必须前后数量相等,不等会报错 59 # a,b = (1,2) 60 # (a,b) = (1,2)#上面的三种写法是等价的,#元组的括号可以不加,只要有逗号就是元组类型的 61 # print(a) 62 # print(b) 63 64 #元组的括号可以不加,只要有逗号就是元组类型的 65 # a = 1 66 # print(type(a)) #<class 'int'> 67 # a = 1, 68 # print(type(a)) #<class 'tuple'> 69 # a = (1,) 70 # print(type(a))#<class 'tuple'> 71 72 # ##字典的嵌套 73 # wf = { 74 # "name":"汪峰", 75 # "age":52, 76 # "hobby":["唱歌", "上头条", "穿皮裤"], 77 # "wife": { 78 # "name": "章子怡", 79 # "age": 49, 80 # "hobby":["演戏", "上电视", "当导师"], 81 # "tishen": { 82 # "name":"萌萌", 83 # "age":28 84 # }, 85 # "zhuli":{ 86 # "name":"磊磊", 87 # "age": 20 88 # } 89 # 90 # }, 91 # "zhuli":{ 92 # "name":"宝宝", 93 # "age":23, 94 # "hobby":["抽烟","喝酒","烫头"] 95 # } 96 # } 97 # #汪峰老婆替身的名字 98 # print(wf['wife']['tishen']['name']) 99 # 100 # #汪峰老婆的第二个爱好 101 # print(wf['wife']['hobby'][1]) 102 # 103 # #汪峰助理的第三个爱好 104 # print(wf['zhuli']['hobby'][2]) 105 # 106 # #汪峰的助理的+10岁 107 # wf['zhuli']['age'] += 10 108 # print(wf['zhuli']['age']) 109 # 110 # #汪峰老婆的添加一个爱好-导戏 111 # wf['wife']['hobby'].append('导戏') 112 # print(wf['wife']['hobby']) 113 # 114 # #汪峰助理的第1个爱好-抽烟 删除 115 # # del wf['zhuli']['hobby'][0] 116 # # wf['zhuli']['hobby'].pop(0) 117 # wf['zhuli']['hobby'].remove('抽烟') 118 # print(wf['zhuli']['hobby']) 119 # 120 # 121 # 122 # 123 # ##set 集合 唯一能用到的点就是去重复 x 转换成 y 124 # lst = ["麻将", "牌九", "骰子", "扑克", "老虎鸡", "骰子", "扑克", "老虎鸡", "扑克", "老虎鸡", "扑克", "老虎鸡"] 125 # s = set(lst) 126 # lst1 = list(s) 127 # print(lst1) 128 # print(lst)
6.今日作业及默写
内容回顾:
1. 字典
{key:value, key:value.....}
成对的保存数据
字典没有索引. 不能切片, 字典的key必须是可哈希的.不可变的
1. 增加:
dic[新key] = 值
dic.setdefault(key, value) 新增, 查询
2. 修改:
dic[老key] = 值
dic.update(d) 把d更新到dic中
3. 删除;
pop(key)
popitem() 随机删除
del dic[key]
clear() 清空
4. 查询
for k in dic:
k
dic[k]
get(key) 如果key不存在, 返回None
dic[key] 如果key不存在, 报错
setdefault(key, value)
根据key查询出value
5. 相关操作
1. keys() 所有的key
2. values() 所有的value
3. items() 所有的key和value
for k, v in dic.items(): # 自动解包
k
v
set集合
内部元素必须可哈希. 不可变
内部元素不重复
add() 添加
frozenset() 冻结集合. 不可变的. (##一般的集合本身是可变的,但是要求其内部的元素是不可变的,而这个鸡舍本身就是不可变的)