文章目录
- Python基础 P7 字典和集合
- 字典
- 字典基础
- 内置函数
- 增操作fromkeys()
- 删操作pop()、popitems()和clear()
- 改操作update()
- 查操作get()和in/not in
- 视图对象keys(),values(),items()
- 拷贝copy()
- setdefault()
- 其他函数
- 键值数量len()
- 列表转换list()
- 迭代器转换iter()
- 逆向序列reversed()
- 嵌套与推导式
- 字典嵌套
- 字典推导式
- 集合
- 集合基础
- 内置函数
- 复制copy()
- 集合关系issubset() 、issuperset()和isdisjoint()
- 不可变集合frozenset
- 删操作pop()和clear()
- 进阶练习
- 更多内容
Python基础 P7 字典和集合
字典
字典是python中唯一实现了映射关系的内置关系,字典活跃在python程序的背后,即便你的源码里并没有直接用到它
映射关系是一种程序设计技术,用于实现面向对象编程语言里不同类型的数据之间的转换,从效果上说,它其实是创建了一个可在编程语言里使用的“虚拟对象数据库”;在数学术语上,指两个元素集之间元素相互“对应”的关系
映射类型区别于序列类型,序列类型以数组的形式存储,通过索引的方式来获取相应位置的值,一般索引值与对应位置存储的数据是毫无关系的
字典基础
python中的字典把这个字(或单词)称为“键”(key),把其对应的含义称为“值(value)”;python的字典在有些地方称为哈希(hash),有些地方称为关系数组
创建和访问字典
创建字典需要使用大括号{ }
内部字典由“键”和“值”共同构成,由:区分
每一对键值组合称为“项”
字典的键值必须独一无二,但值可以相同,值可以取任何数据类型,但必须是不可变得,如字符串、数或元组
方法一:根据映射关系创建
dict1 = {'键1':值1, '键2':值2, '键3':值3}
方法二:根据dict()内置函数创建
dict1 = dict{键1 = 值1, 键2 = 值2, 键3 = 值3}
方法三:直接给字典赋值(相当于添加与修改)
dict1 = {'键1':值1, '键2':值2, '键3':值3}
dict1['键4'] = 值4
dict2['键1'] = 值5
方法四:使用zip()进行创建
dict1 = dict{zip(['键1', '键2', '键3'],['值1', '值2', '值3'])}
# 创建一个空字典
dict1 = {}
print(dict1)
# 方法1:使用大括号创建字典
dict2 = {'a': 1, "b": 2, "c": 3}
print(dict2)print(dict2['a'], dict2['b'], dict2['c'])
# 方法2:使用内置函数创建字典
dict3 = dict(d=4, e=5, f=6)
print(dict3)
print(dict3['d'], dict3['e'], dict3['f'])
# 方法3:对字典进行修改和添加实现字典创建
dict3['f'] = 66
print(dict3)
dict3['g'] = 7
print(dict3)
# 方法4:使用zip()对字典进行创建
dict4 = dict(zip(['g','h','i'],[8,9,10]))
print(dict4)
内置函数
增操作fromkeys()
fromkeys()方法用于创建并返回一个新的字典,它有两个参数,第一参数是字典的键,第二参数是可选的,是传入键对应的值,如果不提供,那么默认是None
dict1 = {}
dict1 = dict1.fromkeys((1, 2, 3))
print(dict1)
dict2 = {}
dict2 = dict2.fromkeys((1, 2, 3), "a")
print(dict2)
删操作pop()、popitems()和clear()
pop是给定键弹出对应的值,而popitem是弹出一个项
可以使用clear来清除字典
dict1 = dict(a=1, b=2, c=3, d=4, e=5)
print(dict1.pop('b'))
print(dict1)
print(dict1.popitem())
print(dict1)
dict1.clear()
print(dict1)
改操作update()
update可以用来更新字典
dict1 = dict(a=1, b=2, c=3, d=4, e=5)
print(dict1)
dict1.update(d=44)
print(dict1)
查操作get()和in/not in
get()可以更宽松的访问字典项,当键不存在的时候不会报错, 也可以在第二个参数位置设置不存在的返回值
可以使用成员资格操作符来判断键是否存在,使用in或not in
dict1 = dict(a=1, b=2, c=3, d=4, e=5)
print(dict1.get('a'))
print(dict1.get('f'))
print(dict1.get('f', '不存在'))
print('a' in dict1)
print('f' in dict1)
视图对象keys(),values(),items()
keys用于返回字典中的键
value用于返回字典中所有的值
items用于返回字典里所有的项
dict1 = dict(a=1, b=2, c=3, d=4, e=5)
print(dict1.keys())
print(dict1.values())
print(dict1.items())
拷贝copy()
copy方法是用于浅拷贝整个字典
dict1 = dict(a=1, b=2, c=3, d=4, e=5)
dict2 = dict1.copy()
print('dict1 id:', id(dict1))
print('dict2 id:', id(dict2))
print('dict1:', dict1)
print('dict3:', dict2)
setdefault()
setdefault方法与get有点相似,但是,setdefault在字典中找不到相应的键时会自动添加
dict1 = dict(a=1, b=2, c=3, d=4, e=5)
print(dict1.setdefault('a'))
print(dict1)
print(dict1.setdefault('f'))
print(dict1)
其他函数
键值数量len()
使用len函数来获取字典的键值对数量
dict1 = {'a': 1, "b": 2, "c": 3}
print(len(dict1))
列表转换list()
通过list(dict1)可以将字典的键转化为列表,可以使用list(dict1.values)将值转换为列表
dict1 = {'a': 1, "b": 2, "c": 3}
print(list(dict1))
print(list(dict1.values()))
迭代器转换iter()
iter会将字典的键构成一个迭代器
dict1 = {'a': 1, "b": 2, "c": 3}
e = iter(dict1)
print(next(e))
print(next(e))
print(next(e))
print(next(e))
逆向序列reversed()
reversed可以将字典的键进行逆向操作
dict1 = {'a': 1, "b": 2, "c": 3}
print(list(reversed(dict1)))
print(list(reversed(dict1.values())))
嵌套与推导式
字典嵌套
字典也可以嵌套,字典里面可以嵌套字典,字典里面也可以嵌套列表
dict1 = {'a': {'a1': 1, 'a2': 2}, "b": {'b1': 3, 'b2': 4}, "c": {'c1': 5, 'c2': 6}}
dict2 = {'a': [9, 8, 7], "b": [6, 5, 4], "c": [3, 2, 1]}
print(dict1['b']['b2'])
print(dict2['c'][0])
字典推导式
dict1 = {x: ord(x) for x in "Cage"}
print(dict1)
集合
集合基础
如果用大括号括起来,又没有体现出映射关系,那么python就会认为这堆数据是一个集合而不是映射,而且集合的的内容是唯一的这一点跟字典的键值是一样的;集合是无序的,也就是不能试图去索引集合中的某一个元素。
集合创建、访问、添加和删除
# 直接创建集合
set1 = {1, 2, 3, 4, 4, 4}
print(set1)
# 内置函数创建集合
set2 = set(['c', 'a', 'g', 'e'])
print(set2)
# in/not in
print(2 in set1)
print('b' in set2)
# add和remove
set1.add(5)
print(set1)
set2.remove('a')
print(set2)
内置函数
复制copy()
复制集合的方法copy
a = set("Cage")
print(a)
b = a.copy()
print(b)
集合关系issubset() 、issuperset()和isdisjoint()
issubset() 判断该集合是否为另一个集合的子集
issuperset() 判断该集合是否为另一个集合的超集
isdisjoint() 用来判断两个集合之间是否相关
a = set("Cage")
print(a.issubset("Cage Hello"))
print(a.issuperset("Ca"))
print(a.isdisjoint(set("C")))
不可变集合frozenset
有时候希望集合中的数据具有稳定性,也就是说,像元组一样,不能随意地增加或删除集合中的元素。那么可以定义成不可变集合。
set1 = frozenset({1, 2, 3, 4, 4, 4})
print(set1)set1.add(5)
print(set1)
删操作pop()和clear()
pop()用于随机从集合中弹出一个元素
clear()将集合清空
a = set("Cage")
print(a.pop())
print(a.clear())