Python自学笔记之dict和set

jopen 10年前

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有以下特点:

  1. 查找速度快,时间复杂度不会随dict增大而增大

  2. 需要占用大量内存,内存浪费多

另外需要牢记的是,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值。