一、什么是字典
字典是以key:value的形式来保存数据
用{}表示,存储的是key:value
dic = {"jay":"周杰伦", "王力宏":["龙的传人", "唯一", "改变自己"], ["战狼", "战狼2"]: "武警"} print(dic)
二、字典的增删该查(重点)
1.字典的添加
dic[新key] = 值
dic = {"意大利": "李云龙", "美国": "美国往事"} dic["日本"] = "东京审判" # 新key表示添加 print(dic)
setdefault() (难点)
有添加的功能,如果key是存在的. 不添加
流程: 判断你给的key是否在字典中存在了.如果已经存在了. 就不再新增. 如果不存在. 执行新增操作
dic = {"意大利": "李云龙", "美国": "美国往事"} dic.setdefault("美国", "三傻大闹宝莱坞") print(dic)
2.删除
pop(key)
删除指定key值的value
dic = {"张艺谋":"红高粱", "李安":"断臂山", "陈凯歌":"霸王别姬", "郭德纲":"祖宗十九代"} dic.pop("郭德纲") # 你要记住的 print(dic)
popitem()
删除最后一项,在python早期版本中字典是无序的,随机删除一项(2.x版本)
dic = {"张艺谋":"红高粱", "李安":"断臂山", "陈凯歌":"霸王别姬", "郭德纲":"祖宗十九代"} dic.popitem() print(dic)
3.修改
dic(key(旧)) = 值
dic = {"河南":"胡辣汤", "开封": "灌汤包", "武汉":"热干面"} dic['河南'] = "烩面" # 老key = 值 print(dic)
update()更新字典
把dic2怼到dic1里面. 把dict2中的内容更新到dic1
dic1 = {"赵四":"刘晓光", "刘能":"王晓利", "王木生":"范伟"} dic2 = {"赵四":"宝宝", "刘能":"萌萌", "皮校长":"皮长山"} dic1.update(dic2) # 把dic2怼到dic1里面. 把dict2中的内容更新到dic1 print(dic1) print(dic2)
4.查询
dic[key值]
dic1 = {"赵四":"刘晓光", "刘能":"王晓利", "王木生":"范伟"} print(dic1["赵四"]) #如果print的是 print(dic1["赵四四"]) # KeyError: '赵四四' key不存在
get(key,value)
当key不存在. 返回第二个参数. 默认第二个参数是None
dic1 = {"赵四":"刘晓光", "刘能":"王晓利", "王木生":"范伟"} print(dic1.get("刘能")) print(dic1.get("刘能能", "没有这个人")) # 当key不存在. 返回第二个参数. 默认第二个参数是None
setdefault(key, value)
setdefault() 第一个功能是添加(当key不存在). 第二个功能是查询(根据你给的key查询)整个执行流程: 判断给的key是否存在. 如果存在. 就不执行新增流程.直接查询出这个key对应的value如果key不存在. 先执行新增操作. 再使用key把对应的value查询出来
dic1 = {"赵四":"刘晓光", "刘能":"王晓利", "王木生":"范伟"} ret = dic1.setdefault("皮长山", "皮校长") print(ret) # 皮校长 ret = dic1.setdefault("王木生", "宝宝") print(ret) # 范伟
5.遍历,字典是一个可迭代对象
for循环
dic = {"赵四":"刘晓光", "刘能":"王晓利", "王木生":"范伟"} for key in dic: # 直接循环字典拿到的是key, 有key直接拿value print(key) print(dic[key])
不常用的:
keys()
拿到字典里的每一个key
dic = {"赵四":"刘晓光", "刘能":"王晓利", "王木生":"范伟"} print(dic.keys()) # dict_keys(['赵四', '刘能', '王木生']) 像列表. 山寨列表 for k in dic.keys(): # 拿到的是字典中的每一个key print(k)
values()
当需要单独获取到所有的value的时候
print(dic.values()) # dict_values(['刘晓光', '王晓利', '范伟']) 所有的value的一个数据集 for v in dic.values(): print(v)
解构
# 遍历字典两套方案 dic = {"赵四":"刘晓光", "刘能":"王晓利", "王木生":"范伟"} #1. 使用for循环直接遍历字典的key for key in dic: print(key) print(dic[key]) #2. 可以使用字典的items()+解构可以直接获取到key和value for k, v in dic.items(): print(k) print(v)
三、字典的嵌套
字典的嵌套. 字典套字典
一层一层的去找
例子:
wf = { "name":"汪峰", "age":52, "hobby":["唱歌", "上头条", "穿皮裤"], "wife": { "name": "章子怡", "age": 49, "hobby":["演戏", "上电视", "当导师"], "tishen": { "name":"萌萌", "age":28 }, "zhuli":{ "name":"磊磊", "age": 20 } }, "zhuli":{ "name":"宝宝", "age":23, "hobby":["抽烟","喝酒","烫头"] }, "children":[{"name":"汪老大"}, {"name":"汪老二"}] } wf['children'][1]["age"] = 2 # 汪峰老婆替身的名字 print(wf['wife']['tishen']['name']) # 汪峰老婆的第二个爱好 print(wf['wife']['hobby'][1]) # 汪峰助理的第三个爱好 print(wf['zhuli']['hobby'][2]) # 汪峰的助理+10岁 wf['zhuli']['age'] = wf['zhuli']['age'] + 10 # 汪峰的老婆添加一个爱好("导戏") wf['wife']['hobby'].append("导戏") # 添加完毕了 # 删除汪峰助理的"抽烟"爱好 wf["zhuli"]["hobby"].remove("抽烟") print(wf)
四、集合
去重复
集合中的元素是不重要的,必须是可hash的(不可变),例如字典中的key
空集合:set()
空元组:tuple()
空列表:list()
非空集合:例如 {123}集合,集合其实就是不存value的字典
由于不太重要这里就不一一讲解了,下面是关于集合的例子
s = {"周润发", "大润发", "王润发", "周润发"} # 不重复的 print(s) # 唯一能用到的点. 去重复 lst = ["麻将", "牌九", "骰子", "扑克", "骰子", "扑克", "扑克", "扑克", ] # 把列表转化成集合 x 转化成y类型 y() s = set(lst) # print(s) # 把集合变回列表 lst = list(s) print(lst) # 顺序是乱的 s = {"刘嘉玲", "赵本山", "莱昂纳多迪卡普里奥", "罗纳尔多"} s.add("刘嘉玲") # 记 print(s) s.update({"刘嘉玲", "刘能", "赵四"}) # 迭代更新 print(s) ret = s.pop() # 随机删除一个 print(s) print(ret) s.remove("罗纳尔多") print(s) 集合还有字典. 是没有索引和切片的 s = {"刘嘉玲", "赵本山", "莱昂纳多迪卡普里奥", "罗纳尔多"} 把罗纳尔多修改成梅西 s.remove("罗纳尔多") s.add("梅西") print(s) 迭代 for el in s: print(el) s1 = {"门神", "灯神", "灯神你在笑什么?"} s2 = {"门神", "灯神", "你俩在干什么?"} 交集 print(s1 & s2) print(s1.intersection(s2)) 并集 print(s1 | s2) print(s1.union(s2)) # 差集 print(s1 - s2) # s1中特有的内容 print(s1.difference(s2)) # 反交集 print(s1 ^ s2) # 两个集合中特有的内容 print(s1.symmetric_difference(s2)) 集合本身是可变的数据类型 . 不可哈希 集合套集合->不能互相嵌套的 集合中的元素必须可哈希(不可变的) s = {123} 如果非要集合套集合 s = frozenset({"哈哈","呵呵"}) # 不可变的数据类型(集合) for el in s: print(el)