可变的数据类型永远都不能做hash
不可变的数据类型才可以做hash
A,字典
一,字典的概念
1,字典以键值对的形式 存在:{key:value}
2,其中的key值会进行hash运算,生成hash表,所以字典的访问效率要优于普通的序列数据类型(列表,元组)
3,key值由于需要通过hash,则一些可变的数据类型不可以作为key值,而value值没有限制,可以使任何的数据类型
4,由于进行了hash运算年,那么在内存中字典其中的数据是无序的,没有办法进行一些像缩影和切片一样的操作
5,字典为可变数据类型,so不可作为key值
6,集合是乱序的
二,创建方式
1,大括号包裹键值对:变量名 = {键:值,键:值}
eg:mydict = {1:"a",2:"b"}
2,工厂方法创建 : 变量名 = dict(([键:值],[键:值]))
eg:mydict = dict(([1,"a"],[2,"b"]))
3,字典的内建方法:变量名 = dict.fromkeys([1,2,3,4,5],'a')
这样可以批量创建key值,但是缺点是无法独立分配value值
具体操作
eg:
三,访问字典
1,获得所有的key值:dict.keys()
2,获得所有的value值:dict.values()
3,迭代获取其中的key值:for key in dict:key
四,判断是否存在字典中
1,获取所有的value值:dict.values()
2,可以使用in还有not in判断是否存在字典中有对应的key值,返回值为bool类型
eg:
五,更新字典
eg:
B,集合
一,集合的概念
1,集合:把不同的元素组合在一起形成一个数据集合(数据唯一,不会保存两个一样的数据,即去重)
集合分为两种,可变集合(set),不可变集合(frozenset)
集合的内部结构和字典类似,但是不存储value,其中的元素也会进行hash运算,可以称得上是一个没有value的字典
二,创建集合
1,大括号包裹创建:myset = {1,2,3,4,'abc'} (这是可变的集合)
2,工厂方式创建:可变的myset = set([1,2,3,4,5]) 和 不可变的frozenset([1,2,3,4,5])
eg:
3,访问集合
1,直接变量名访问
2,迭代访问集合
eg: for var in set :
print(var)
三,更新集合(仅限于set,而frozenset不可以)
1,set.add():更新可hash数据类型到集合中,并维持原样()
2,set.update():如果传入的是一个序列,将被拆分成单个元素,并且去掉重复
由于集合中的数据元素进行hash运算,可变的数据类型(列表)是不可以进行hash运算的,也就不能传递进来被更新,可变集合支持更新操作,不可变集合不支持该操作
四,删除集合中的元素
1,myset.remove(var)
2,del myset
五,集合类型操作符
1,子集和超集(返回值喂bool)
a<b a是b的子集 a.issubset(b)
#b含有a中的元素
a>b a是否是b的超集 a.issuperset(b)
#超集就代表a中的元素南扩了所有班的集合元素
2,交并补