本文仅供个人记录和复习,不用于其他用途
dict
Python提供了字典dict
(也就是dictionary),其他语言中被称为map,使用键值进行存储,方便查找。
例如,如果要根据学生姓名查找成绩,那么需要两个list:
|
|
如果是这样的话,那么就要先从名字找,找到之后再取出分数,但是这样会随着list的变长而变得耗时。
那么字典dict是怎么做的呢?我们往下看:
>>> d = {'hyx': 97, 'miao': 98, 'huyinx': 99}
>>> d['hyx']
97
有人可能会问,这个和上面的不是一样吗?是的,如果单从形式上看,dict也不过是个二维数组而已。然而,既然它被称为字典,那么我们不妨想一想字典是怎么用的。
我们首先通过部首表,找到相应偏旁,然后锁定我们要的字,之后就翻到指定的页码就可以了。而list相当于从字典第一页开始查找,直到找到我们要的。所以列表越长,效率越低下。dict能够根据我们给的键值,自动转换成相应“页码”,就能很快的锁定我们要的值了。这种模式被称为“key-value”。
当然,我们也能通过key来创建value:
>>> d['fantastic'] = 100
>>> d['fantastic']
100
如果这个dict中没有相应的key,那么就会新添加一个,不过一个dict中的key不能重复,所以不管你是添加还是修改,每个key只对应唯一的value。
不过呢,假如这个dict没有这个key,那么Python就会报错。为了确认是否存在相应key,我们可以使用in
:
>>> 'qwer' in d
False
或者呢,可以使用dict中的get
方法,如果key不存在,会返回None,当然也可以返回你要的值:
>>> d.get('qwer')
>>> d.get('qwer', 12345)
12345
注意,如果你是用的是交互式命令行,那么None是不会显示的。
如果你要删除一个key,那么可以使用pop(key)
方法:
>>> d.pop('fantastic')
100
>>> d
{'hyx': 97, 'miao': 98, 'huyinx': 99}
与list,dict占用的内存多,但是查找和插入速度极快,而且顺序不会产生影响。
list所占内存小,但是查找和插入时间随着元素增加而增加。
事实上,key是通过哈希算法来计算位置,由于key必须唯一,所以key不能够产生变动。字符串和整数不会改变,都可以作为key,但是list不行。
set
set和dict类似,唯一的不同就是key不存储value:
>>> s = set([1, 2, 3])
>>> s
set([1, 2, 3])
创建set需要我们提供一个list,不过呢,传入之后set就包含了list的元素,而不是包含list。
由于key的唯一性,list中的相同元素只会被存储一次:
>>> s = set([1, 1, 2, 2, 3, 3])
>>> s
set([1, 2, 3])
可以使用add(key)
方法加入key,同样的,key不会重复:
>>> s.add(4)
>>> s.add(1)
>>> s
set([1, 2, 3, 4])
使用remove(key)
可以移除key:
>>> s.remove(4)
>>> s
set([1, 2, 3])
set可以视作集合,进行数学上集合的交、并运算:
>>> s1 = set([1, 2, 3, 4])
>>> s2 = set([2, 3, 4, 5])
>>> s1 & s1
set([2, 3, 4])
>>> s1 | s2
set([1, 2, 3, 4, 5])
总之记住,dict和set的区别就是set不存储value。另外,key必须是不可变的。
不可变对象
很显然,list是可变对象,那么字符串为什么是不可变对象呢?
>>> a = 'abc'
>>> b = a.replace('a', 'A')
>>> b
'Abc'
>>> a
'abc'
之前的文章已经说过了,a
仅仅只是一个变量,‘abc’
才是字符串,变量的指向可以变,但是字符串本身是不会改变的。
这里用到了replace()
方法,但是它并不会改变字符串,而是新创建一个字符串‘Abc’
并返回。不变对象的任何方法,都不会改变本身,只会返回一个新的对象。
至于tuple,它本身是不变的,但是它可以包含可变的list:
>>> t1 = (1, 2, 3)
>>> d = {t1: 1}
>>> d[t1]
1
如果tuple不包含可变对象,那么它本身可以作为key,注意,仅仅只是tuple整体作为key。我们再看看下面:
>>> t1 = (1, [2, 3])
>>> d = {t1: 1}
那么这样是绝对会出错的,所以请牢记,key必须是不可变对象,我们一般使用字符串做key。