Python之dict、set
1
dict
Python里面保存数据,使用最多的是数据字典,也称之为dict,这里的dict可以理解为c++里面的map,使用key-value存储,它的查找速度。很快,这里我们看看例子:
如果说我们要通过某个学生的名字查询他对应的成绩,这样一个工作如果使用list,那么我们需要两个list来实现,一个保存学生的名字,另外一个保存学生的成绩:
查询一条记录,需要在名字list中查找到对应的名字下标,然后去分数list中寻找对应下标的值。
假设我们使用dict来实现,只需要一个保存姓名---成绩这种映射关系的表就可以,直接访问对应名称的记录就行,就像翻字典一样。
存储
除了在定义dict的时候可以更改dict里面的值,其他时间也可以修改对应dict里面的值,修改的方法是直接给对应的记录赋值即可:
以此类推,还可以去倒数的第二个(下标为-2)、倒数第三个(下标为-3)。
添加
list 是一个可变的有序表,所以,可以往list中追加元素,使用的是append方法:
这里需要注意的一点是,前面的值会被后面重新赋值给刷掉,所以在重新赋值一个已经存在的key的value值时候,请确保之前的值已经不再有用。
当我们赋值的key值不存在时,语句会报错。我们有两种方法判断key是否存在于dict中,一种是通过key in dict的方法,另外一种是dic.get(‘key’)查询是否存在对应的值,如下:
删除
要想删除一个key,可以使用pop(key)的方法,对应的value也会从dict中删除。
dict和list相比,有以下几个特点:
1.它查找和插入的速度比较快,因为它没有下标的概念,不会随着key值的增多而变慢
2.它需要占用大量的内存,是一种空间换时间的方法
而list则刚好相反:
1.查找和插入的时间随着元素的增加而增加
2.占用的空间比较小,用时间换空间
要保证hash的正确性,作为key的对象就不能变。在Python中,字符串、整数等都是不可变的,因此,可以放心地作为key。而list是可变的,就不能作为key
2
set
set和dict很像,唯一的区别是set不存储value,只存放key,在set中没有重复的key,创建set的方法如下:
set的创建,需要使用一个list作为参数,我们可以看到,set会自动将重复的元素值进行过滤。另外,set中的add()方法和remove()方法可以用来增加或者删除元素。初次之外,两个不同的set还可以像数学里面的集合一样做各种运算,如下:
一个简单的replace问题
今天在做MHA同步状态判断的时候,需要对MHA的脚本进行判断,脚本的输出是一些文本字符串,每个字符串的末尾都有一个换行符,想通过输出的内容直接判断MHA的运行状态、SSH可否连接以及repl是否同步,如下:
当我尝试把这些语法里面的换行符通过replace方法去掉,然后再进行校验的过程中,发现始终无法匹配,也就是说running.replace(‘\n’,’’)无法匹配MHA is running now.
于是查询了python中的replace函数,得到了如下的结果,简单分享一下。
首先需要说明的是,这个running是一个字符串,是一个不可变对象,也就是说它的内容是不会发生变化的:
当我们调用replace的时候,控制台的输出中确实去除掉了字符串末尾的\n符号,但是当我们查看running变量的时候,发现它并没有发生相应的变化。这就是Python中的不可变对象。
通过这个例子,我们需要记住的是,running是一个变量,它指向一个字符串,当我们调用running.replace()的时候,实际上这个replace作用在字符串上面,它的作用是创建了一个新的字符串并返回在控制台终端上面供我们查看,如果我们用NewString来保存这个字符串,NewString的内容就是我们处理之后的字符串。
总结:对于不便对象,调动对象自身的任何方法,不会改变该对象自身的内容。