Python学习笔记(8)——dict和set

这一章来认识一下Python中的字典和键值。

本文仅供个人记录和复习,不用于其他用途

dict

Python提供了字典dict(也就是dictionary),其他语言中被称为map,使用键值进行存储,方便查找。

例如,如果要根据学生姓名查找成绩,那么需要两个list:

1
2
names = ['hyx', 'miao', 'huyinx']
scores = [97, 98, 99]

如果是这样的话,那么就要先从名字找,找到之后再取出分数,但是这样会随着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。