Python自学笔记之dict和set
dict
dict全称dictionary(只为复习一下不常用单词),也就是其他语言中的map,使用键值对存储数据,查找速度极快。
使用方法:d = {'key1':value1, 'key2':value2}
查找key对应值的方法:d['key1'] 对应输出即为value1
如未初始化,添加值的方法:d['key1'] = value1_1 注意,一个key只能对应一个值,后面放入的值会把前面的值冲掉
如果key不存在,dict会报错。通常有两种方法可以用来检查key是否存在。
第一种,in的使用方法:'key1' in d 返回结果为true或false;
第二种,dict提供的get方法,其使用方法:d.get('key1') 如果key不存在,返回none,也可以自定义返回值,如 d.get('key1', -1) 则key不存在时返回-1。 注意,返回none的时候Python的交互命令行不显示结果。
删除key的方法:d.pop('key1') 当然,对应的value也会一并删除,而运行此方法显示的值为value1
务必注意:dict内部存放顺序和key放入的顺序无关
和list相比,dict有以下特点:
-
查找速度快,时间复杂度不会随dict增大而增大
-
需要占用大量内存,内存浪费多
另外需要牢记的是,key必须是不可变对象。因为dict根据key来计算value的存储位置,如果相同的key每次计算时都得出不同的 value,那dict内部就会完全混乱。通过key计算位置的方法是哈希算法,要保证hash的正确性,作为key的对象就不能变。Python中字符串和整数都是不可变对象,可以放心作为key,而list是可变的所以不能作为key。
set
set和dict类似,也是一组key的集合,只不过不存储值。由于key不能重复,所以set中没有重复的元素,定义时重复元素会被自动过滤。
要创建一个set,需要一个list做输入,创建方法:s = set([key1, key2, key3]) 此时s的显示结果为set([key1, key2, key3]),注意此结果中的[]不再是一个list,而是告诉你set中的元素为key1,key2,key3
添加元素的方法:s.add(keyx)
删除元素的方法:s.remove(keyx)
set可以看成数学上无序无重复元素的集合,两个set可以做数学意义上的交集和并集的操作,如: s1和s2两个set做交集为 s1 & s2; 做并集为 s1 | s2
set和dict原理相同,也不能放入可变对象,因为不能判断两个可变对象是否相等也就不能保证set中无重复元素。
不可变对象
对于不可变对象来说,调用对象的任意方法也不会改变对象自身的内容。相反,这些方法会创建新的对象并返回,这样就保证了不可变对象永远是不变的。
例如:对不可变对象字符串进行如下操作,
a = 'abc'
a.replace('a', 'A')
此时a.replace('a', 'A')显示的结果确实是'Abc',而a显示的结果仍旧是'abc'
而若对可变对象list进行如下操作,
a = ['b', 'c', 'a']
a.sort()
则不论是a.sort()还是a,显示的结果都是 ['a', 'b'. 'c'],list内部的内容已经改变了。
注意: tuple虽然是不可变对象,但由于其内部可以存放list,所以也不适合做key值。