文章目录
字典
字典特点
- 键值对,包含键对象和值对象
- 无序可变序列
- 通过键对象操作键值对
- 键是任意不可变数据(整数,浮点数,字符串,元组),列表,字典,集合这些可变对象不能作为键
- 键不能重复
- 值可以任意数据可以重复
字典操作
字典的创建
- 通过 { } 或dict()函数
1.a={“name”:“gaogao”,“age”:18,“job”:“programmer”} #用冒号表示键值对应关系
2. b=dict(name=“gaogao”,age=18,job=“programmer”) #dict函数,括号内用等号指明键值对应关系,键不用引号
3. c=dict([(“name”,“gaoqi”),(“age”,18),(“job”,“programmer”)]) #dict函数,以元组形式列出对应关系,包含在一个列表中
- 通过zip()创建
a=[“a”,“b”,“c”]
b=[1,2,3]
c=dict(zip(a,b))
d=dict(zip(b,a))
- 通过fromkey创建字典
a=dict.fromkeys([“name”,“age”,“job”])
输出值的部分为None,也是一个值,表示空
字典元素的访问
- 通过键索引
- a.get(键,“设定值”)
优点:若没有该键,则返回none,而不是报错
可以指定不存在时返回的值
- a.items()获得所有键值对
- a.keys()列出所有的键
- a.values()列出所有的值
- len(a)获得键值对个数
- “name” in a : True检测键是否在字典中
元素的添加
- a[“sex”]=“female” #直接赋值,可以改值也可以添加键值对
- a.update(b) #用update更新字典,可以替换也可以添加,以括号里的字典为准
元素的删除
- del(a[“name”]) #通过dei,[]内用键索引删除
- a.pop(“age”) #()内用键索引删除,返回对应的值
- a.clear() #全部删除,clear只是清空字典,但a仍是字典格式,空字典
- a.popitem() #popitem随机删除键值对,并返回该键值对,用元组格式
序列解包
元组,列表,字典都可以解包
- x,y,z=1,2,3
x,y,z=(1,2,3) #元组
[a,b,c]=[“d”,“e”,“f”] - a={“name”:“gaogao”,“age”:18,“job”:“programmer”}
m,n,p=a #默认m,n,p被赋予键 - x,y,z=a.values() #x,y,z被赋予值
- o,p,q=a.items() #o,p,q被赋予键值对,存放在元组中
字典底层原理
- 字典对象的核心是散列表
- 散列表是一个稀疏数组
- 数组的每个单元叫做bucket(表元)
- 每个bucket有两部分:键对象的引用,值对象的引用
- 键必须可散列:数字,字符串,元组都是可散列的(以散列表的结构存储)
- 字典在内存中开销巨大,空间换时间
- 向字典中添加新键可能导致扩容,导致散列表中的键的次序变化,注意不要同时进行遍历操作
将键值对放进字典底层过程
- 创建字典对象,已知数组长度为8
- 要将“name”=“gao”放进散列数组,先计算“name”的散列值,通过hash来计算 bin(hash(“name”))
- 得到二进制散列值,因为长度为8,先看后三位的值以及对应位置是否为空,若为空,插入,若不为空,依次取右侧三位作为偏移量
- 会根据散列表的拥挤程度扩容(创建更大的数组,将原有内容拷贝过去),接近2/3时
根据键查找键值对的底层过程
- a.get(“name”)
- 计算name的散列值,根据后三位偏移找到相应的bucket,取出存储的键,求其散列值,若与“name”相同,那么返回改键对应的值即可
集合
集合特点
- 集合就是字典,但只有键对象
- 集合无序可变
- 元素不能重复
集合操作
创建集合
- a={1,2,3}
print(type(a)) #set
- #使用set将元组,列表,字符串变成集合
a=[1,2,3]
b=“abc”
c=(“a”,1,2)
print(set(a),set(b),set©)
增加元素
a.add(9)
删除元素
- remove删除指定元素
a={1,2,3,4,5}
a.remove(3)
- clear 清空集合
a.clear()
交/并/差集
两套操作都不改变原集合
- 并集
a|b
a.union(b)
- 交集
a&b
a.intersection(b)
- -差集
a-b
a.difference(b)
代码
#字典的创建
a={
"name":"gaogao","age":18,"job":"programmer"} #用冒号表示键值对应关系
print(a)
b=dict(name="gaoqi",age=18,job="programmer") #dict函数,括号内用等号指明键值对应关系,键不用引号
print(b)
c=dict([("name","gaoqi"),("age"