5.字典
字典
字典的介绍
字典(dict)是python中唯一的一个映射类型.他是以{ }括起来的键值对组成. 在dict中key是 唯一的. 在保存的时候, 根据key来计算出一个内存地址. 然后将key-value保存在这个地址中. 这种算法被称为hash算法, 所以, 切记, 在dict中存储的key-value中的key'必须是可hash的, 如果你搞不懂什么是可哈希, 暂时可以这样记, 可以改变的都是不可哈希的, 那么可哈希就意味着不可变. 这个是为了能准确的计算内存地址而规定的.
字典是以{key:value}的形式来保存数据,用键值对形式,key值需要经过hash
维护是一个特殊的排序结构,无法用简单的二维线性来表示
已知的可哈希(不可变)的数据类型: int, str, tuple, bool
不可哈希(可变)的数据类型: list, dict, set
语法 :
{key1: value1, key2: value2....}
注意: key必须是不可变(可哈希)的. value没有要求.可以保存任意类型的数据
# 合法 dic = {123: 456, True: 999, "id": 1, "name": 'sylar', "age": 18, "stu": ['帅 哥', '美⼥女女'], (1, 2, 3): '麻花藤'} print(dic[123]) print(dic[True]) print(dic['id']) print(dic['stu']) print(dic['stu']) print(dic[(1,2,3)]) #不合法 dic = {[1,2,3]:'周杰伦'} #list是可变的 dic = {{1:2}:'哈哈'} #dict是可变的 dic = {{1,2,3}:'呵呵呵'} #set是可变的
dict保存的数据不是按照我们添加进去的顺序保存的. 是按照hash表的顺序保存的. 而hash表 不是连续的. 所以不能进行切片工作. 它只能通过key来获取dict中的数据 .
字典的增删改查(重点)
1. 添加
dic[新key] = 值
setdefault()
dic = {"意大利":"李云龙","美国":"美国往事"} dic["日本"] ="东京热" #新key表示添加 dic["意大利"] = "小白" #替换 #流程:判断给你的key是否存在字典中,如果存在就不在操作 dic.setdefault("美国","三傻大佬宝莱坞") print(dic)#{'意大利': '小白', '美国': '美国往事', '日本': '东京热'}
2. 删除
pop(key)
dic = {"张艺谋":"红高粱","李安":"断臂山","陈凯歌":"霸王别姬","郭德纲":"祖宗十九代"} dic.pop("郭德纲") dic.popitem() #随机删 del dic["张艺谋"] print(dic)#{'李安': '断臂山'} dic.clear() print(dic)#{}
3. 修改
dic[老key] = 值
update() 跟新字典
dic = {"河南":"胡辣汤", "开封": "灌汤包", "武汉":"热干面"} dic['河南'] = "烩面" # 老key = 值 print(dic)#{'河南': '烩面', '开封': '灌汤包', '武汉': '热干面'} dic1 = {"赵四":"刘晓光", "刘能":"王晓利", "王木生":"范伟"} dic2 = {"赵四":"宝宝", "刘能":"萌萌", "皮校长":"皮长山"} dic1.update(dic2) # 把dic2怼到dic1里面. 把dict2中的内容更新到dic1 print(dic1)#{'赵四': '宝宝', '刘能': '萌萌', '王木生': '范伟', '皮校长': '皮长山'} print(dic2)#{'赵四': '宝宝', '刘能': '萌萌', '皮校长': '皮长山'}
4. 查询
dic[key]
get(key, 值)
setdefault(key, value)
查询一般用key来查找具体的数据.
dic1 = {"赵四":"刘晓光", "刘能":"王晓利", "王木生":"范伟"} #1. 直接使用key就可以拿到value print(dic1["赵四四"]) # KeyError: '赵四四' key不存在 #2. get(key) print(dic1.get("刘能能")) # None 当key不存在返回None print(dic1.get("刘能能", "没有这个人")) # 当key不存在. 返回第二个参数. 默认第二个参数是None #3. setdefault() 第一个功能是添加(当key不存在). 第二个功能是查询(根据你给的key查询) #整个执行流程: 判断给的key是否存在. 如果存在. 就不执行新增流程.直接查询出这个key对应的value #如果key不存在. 先执行新增操作. 再使用key把对应的value查询出来 ret = dic1.setdefault("皮长山", "皮校长") print(ret) # 皮校长 ret = dic1.setdefault("王木生", "宝宝") print(ret) # 范伟
遍历,字典是一个可迭代对象
# 遍历字典两套方案 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)
字典的相关操作
1. keys() 获取到所有的键
2. values() 获取到所有的值
3. items() 拿到所有的键值对
dic = {"赵四":"刘晓光", "刘能":"王晓利", "王木生":"范伟"} #不常用的 print(dic.keys()) # dict_keys(['赵四', '刘能', '王木生']) 像列表. 山寨列表 for k in dic.keys(): # 拿到的是字典中的每一个key print(k) #当需要单独获取到所有value的时候 print(dic.values()) # dict_values(['刘晓光', '王晓利', '范伟']) 所有的value的一个数据集 for v in dic.values(): print(v) print(dic.items()) # 所有的键值对 dict_items([('赵四', '刘晓光'), ('刘能', '王晓利'), ('王木生', '范伟')]) for k, v in dic.items(): # 遍历字典最简单的方案 # print(item) # ('赵四', '刘晓光') # k, v = item # 解构 # k = item[0] # v = item[1] print(k, v)
4. 字典的嵌套
字典的嵌套. 字典套字典
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) # print(wf['zhuli']['name']) # 汪峰老婆替身的名字 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)
5. 集合(不重要). 去重复
# 唯一能用到的点. 去重复 lst = ["麻将", "牌九", "骰子", "扑克", "骰子", "扑克", "扑克", "扑克"] # 把列表转化成集合 x 转化成y类型 y() s = set(lst) print(s)
集合中的元素是不重复的. 必须是可哈希的(不可变), 字典中的key
空集合:set()
空元组:tuple()
空列表:list()
非空集合: {123}集合, 集合其实就是不存value的字典
s = {"刘嘉玲", "赵本山", "莱昂纳多迪卡普里奥", "罗纳尔多"} # 把罗纳尔多修改成梅西 s.remove("罗纳尔多") #移除 s.add("梅西") #添加 print(s)
交集,并集,差集,反交集
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 = frozenset({"哈哈","呵呵"}) # 不可变的数据类型(集合) for el in s: print(el)
练习题
dic1 = { 'name':['alex',2,3,5],
'job':'teacher',
'oldboy':{'alex':['python1','python2',100]}
}
1,将name对应的列表追加一个元素’wusir’。
2,将name对应的列表中的alex首字母大写。
3,oldboy对应的字典加一个键值对’老男孩’,’linux’。
4,将oldboy对应的字典中的alex对应的列表中的python2删除。
dic1['name'].append('wusir') dic1['name'][0]= dic1['name'][0].capitalize() dic1['oldboy']["老男孩"] = 'linux' dic1['oldboy']['alex'].remove('python2') print(dic1)
一. 昨日内容回顾 1. list列表 写法:[元素, 元素] 对元素的数据类型没有要求 也有索引和切片 索引从0开始 切片 lst[start: end: step] 从start到end. 每隔step取一个 增删改查 1. 增加: 1. append() 追加. 在列表的末尾添加 2. insert(index, 元素) 在index位置插入元素 2. 删除: 1. pop(i) 默认从末尾删除, 还可以指定位置删除 2. remove(元素) 删除指定元素 3. 修改: 通过索引去修改元素 lst[3] = "胡辣汤" 4. 查询: for item in lst: # 拿不到索引 print(item) range(m) 从0到m range(m, n) 从m到n range(m, n, p) 从m到n. 每P个取一个 for i in range(len(lst)): i 索引 lst[i] 元素 元组: 不可变的. 只读列表. 有索引. 有下标, 有切片. 不可变: 内部指向 可变的: list 不可变的:str, int, bool, tuple 二. 作业讲解 三. 今日主要内容 1. 什么是字典 字典是以key:value的形式来保存数据 用{}表示. 存储的是key:value 2. 字典的增删改查(重点) 1. 添加 dic[新key] = 值 setdefault() 2. 删除 pop(key) 3. 修改 dic[老key] = 值 update() 跟新字典 4. 查询 dic[key] get(key, 值) setdefault(key, value) 5. 遍历,字典是一个可迭代对象 3. 字典的相关操作 1. keys() 获取到所有的键 2. values() 获取到所有的值 3. items() 拿到所有的键值对 4. 字典的嵌套 字典的嵌套. 字典套字典 5. 集合(不重要). 去重复 集合中的元素是不重复的. 必须是可哈希的(不可变), 字典中的key 空集合:set() 空元组:tuple() 空列表:list() 非空集合: {123}集合, 集合其实就是不存value的字典 预习: 深浅拷贝 小数据池 文件操作(带来的作业) 函数 # 关于set集合作业: 写一个彩票开奖(36选7) from random import randint randint(1,36)
作业