文章目录
1. 字典
1.1 字典的创建
- dict函数创建
dic = dict(name='alex',age=18)
print(dic) #{'name': 'alex', 'age': 18}
- 通过zip()内置函数创建
k = ['name','age','job']
v = ['alex',18,'teacher']
dic = dict(zip(k,v))
print(dic) #{'name': 'alex', 'age': 18, 'job': 'teacher'}
- dict.fromkeys 方法创建
dic = dict.fromkeys("123",[23]) # 批量添加键值对{"1":[23],"2":[23],"3":[23]}
print(dic) #{'1': [23], '2': [23], '3': [23]}
1.2 字典元素的访问
1.2.1 通过“键”获得“值”
- [‘键’] 方式,键不存在时报错
dic = {'name': 'alex', 'age': 18, 'job': 'teacher'}
print(dic['name']) #alex
- .get 方式,键不存在时返回None,也可以设定返回值
dic = {'name': 'alex', 'age': 18, 'job': 'teacher'}
print(dic.get('name')) #alex
print(dic.get('address')) #None
print(dic.get('address','不存在')) #不存在
1.2.2 列出所有的键值对
- items()
dic = {'name': 'alex', 'age': 18, 'job': 'teacher'}
print(dic.items())
#dict_items([('name', 'alex'), ('age', 18), ('job', 'teacher')])
#数据类型为<class 'dict_items'>
#结果为一个高仿列表,不支持索引,支持for循环和list转化
print(list(dic.items()))
# [('name', 'alex'), ('age', 18), ('job', 'teacher')]
for i in dic.items():
print(i[0],i[1])
# name alex
# age 18
# job teacher
1.2.3 列出所有的值
- values()
dic = {'name': 'alex', 'age': 18, 'job': 'teacher'}
print(dic.values())
#与 itmes 一样,结果为一个高仿列表,不支持索引,支持for循环和list转化
print(list(dic.values()))
# ['alex', 18, 'teacher']
for i in dic.values():
print(i)
# alex
# 18
# teacher
1.2.4 列出所有的键
- keys()
dic = {'name': 'alex', 'age': 18, 'job': 'teacher'}
print(dic.keys())
#与 itmes 一样,结果为一个高仿列表,不支持索引,支持for循环和list转化
print(list(dic.keys()))
# ['name', 'age', 'job']
for i in dic.keys():
print(i)
# name
# age
# job
1.3 字典元素添加、修改、删除
1.3.1 字典元素添加和修改
- 直接添加 dic[‘键’] = ‘值’
键不存在,添加;键存在,覆盖
dic = {'name': 'alex', 'age': 18, 'job': 'teacher'}
dic['address'] = 'Peking' #键不存在,添加
print(dic)
# {'name': 'alex', 'age': 18, 'job': 'teacher', 'address': 'Peking'}
dic['address'] = 'Shanghai' #键存在,修改
print(dic)
# {'name': 'alex', 'age': 18, 'job': 'teacher', 'address': 'Shanghai'}
- update() 更新
将新字典中所有键值对全部添加到旧字典上,如果key有重复,则直接覆盖
dic = {'name': 'alex', 'age': 18, 'job': 'teacher'}
dic.update({'address':'SHANGHAI','age':23})
print(dic)
# {'name': 'alex', 'age': 23, 'job': 'teacher', 'address': 'SHANGHAI'}
1.3.2 字典元素删除
del, pop, popitem, clear
dic = {'name': 'alex', 'age': 18, 'job':'teacher','address':'Peking', 'hobby':'music'}
del dic['name']
print(dic)
# {'age': 18, 'job': 'teacher', 'address': 'Peking', 'hobby': 'music'}
a = dic.pop('age') #有返回值
print(a) #18,为该'键'下的'值'
print(dic)
# {'job': 'teacher', 'address': 'Peking', 'hobby': 'music'}
b = dic.popitem() #返回最后一个键值对,以元组的形式
print(b) #('hobby', 'music')
print(dic)
# {'job': 'teacher', 'address': 'Peking'}
dic.clear() #清空字典
print(dic) #{}
1.4 字典解构
dic1 = {"1":"a","2":"b"}
a,b = dic1
print(a) #1
print(b) #2
for i in dic1.items(): #i为高仿列表里的元组
print(i)
# ('1', 'a')
# ('2', 'b')
for k,v in dic1.items(): #此步骤相当于对高仿列表里的元组进行解构
print(k,v) # 获取每个元素的键和值
# 1 a
# 2 b
1.5 字典核心底层原理
字典对象的核心是散列表(也叫哈希表,是根据Key而直接进行访问的数据结构)。散列表是一个稀疏数组(总是有空白元素的数组),数组的每个单元叫做bucket,每个bucket含有两部分:一个是键对象的引用,一个是值对象的引用。
由于,所有bucket结构和大小一致,我们可以通过偏移量来读取指定bucket。
- 数据存储
- 扩容
python会根据散列表的拥挤程度扩容。扩容指的是:创造更大的数组,将原有内容拷贝到新数组中。当已占用的稀疏数组接近2/3时,数组就会扩容。
往字典里添加新"键"可能导致扩容,导致散列表中键的次序变化。因此,不要在遍历字典的同时进行字典的修改。
- 数据读取
2. 集合
集合的底层是字典,只不过集合里面是字典的”键“对象,集合里的元素不可重复
2.1 增加原素
- add
s = {1,2,3,4}
s.add("67") #只能添加一个
print(s) #{1, 2, 3, 4, '67'}
2.2 删除
- remove,pop, clear
s = {1,2,3,4}
s.remove(3) # 指定元素删除
print(s) #{1, 2, 4}
s = {1,2,3,4}
print(s.pop()) # pop随机删除一个元素,并非默认删除最后一个,有返回值
print(s)
s = {1,2,3,4}
s.clear()
print(s) #set() 空集合
2.3 集合其他操作
s1 = {1,2,3,4,5,6,7}
s2 = {5,6,7,1}
print(s1 & s2) # 交集
print(s1 | s2) # 并集
print(s1 - s2) # 差集
print(s1 ^ s2) # 反交集
print(s1 > s2) # 父集(超集)
print(s1 < s2) # 子集