集合 set
1. 无序
2. 去重
3. 定义空集 set()
numbers = {1, 3, 4, 5, 6, 5, 4, 4, 7, 8} print(numbers) print(numbers)
集合操作
1. 求差集 - .difference
2. 求交集 & .intersection
3. 求并集 | .union
student_python = {"xiaoWang", "xiaoMing", "lvChaBiao", "baiLianHua"} student_golang = {"xiaoWang", "beimenchuixue", "ximenchuifeng"} print("only study python student: ", student_python - student_golang) print("study python and golang student: ", student_python & student_golang) print("total students : ", student_python | student_golang)
集合更新元素
1. 添加一个元素 add
2. 添加多项 update
3. 删除一项,不存在,报错 remove
4. 安全删除,没有则返回None discard
students = {"BeiMenChuiXue","QiNiuYun", "BoKeYuan"} # 添加一个元素 students.add("JinRiTouTiao") print(students) # 添加多个元素 students.update(["TengXun", "DouYing"]) print(students) # 删除一项 students.remove("TengXun") print(students) # 安全删除 print(students) status = students.discard("JinRiTouTiao") if status == None: print("rm success") else: print("rm fail") print(students)
集合判断
1. 子集 issubset
2. 父集 issuperset
3. 交集 isdisjiont
python_class = {"BeiMenChuiXue", "QiNiuYun", "AliYun"} golang_class = {"BeiMenChuiXue", "QiNiuYun"} # 判断子集 if golang_class.issubset(python_class): print("golang_class -> python_class") else: print("golang_class !-> python_class") # 判断父集 if python_class.issuperset(golang_class): print("python_class <- golang_class") else: print("python_class !<- golang_class") # 判断交集,无交集则返回真,或者有空交集返回真 if python_class.isdisjoint(golang_class): print("陌路") else: print(python_class & golang_class)
fronzet
一旦定义,无法修改的集合
字典 dict
1. 定义空字典 dict() {}
2. 无序
3. key去重, 有重复key取最后的key对应的value值
4. {key: value,...}
value任意类型: int float bool str list tuple set dict
key必须是不可变类型 int float bool str tuple
student_score = { "xiaoWang": 99, "xiaoLi": 77, "beimenchuixue": 99, "lvChaBiao": 90, "ximenchuifeng": 88 } print(student_score.get("beimenchuixue", None)) print(student_score.pop("lvChaBiao")) student_score.update({ "xiaoWang": 66, }) print(student_score) print(student_score.items()) print(student_score.keys()) print(student_score.values())
访问
1. 通过key访问value [key]
2. 安全访问方式 .get()
set 和 dict实现原理 hash表(连续内存空间,存在空白空间)
带来特性:
1. dict查找的性能远远大于list
2. list随着list数量的增长, 查找时间会增大
3. 查找在dict中不会随着dict增大而增大
dict 原理实现过程
dict存入数据过程
1. 对 key进行 hash运算 ,再进行偏移量 -> 计算出放入位置
2. 位置冲突则,对key取一个值,再加上一个随机值,如果再冲突则再多取一个值,加上随机值 -> 计算得到放入位置
# 直接找到值,时间复杂度为 O(1)
查找过程
1. 计算key的hash值
2. 用hash值的一部分定义hash表中位置
3. 判断表元是否为空,为空则keyError
4. 判断key是否相等,如果不相等则再次取hash值的另外部分进行查找,如果找到则直接返回表元数据
set 必须是可hash, dict的key必须是可hash
dict内存花销大,源于hash表的特性,查询速度快,添加数据有可能改变数据顺序(重新分配hash表和插入冲突解决机制)
判断一个元素是否在集合中和字典的key是否在字典中 in
student_score = { "xiaoWang": 99, "xiaoLi": 77, "beimenchuixue": 99, "lvChaBiao": 90, "ximenchuifeng": 88 } print("xiaoWang" in student_score) print(99 in student_score)