dict 与 set

2020-05-20  本文已影响0人  Peng_001

参考:https://www.liaoxuefeng.com/wiki/1016959663602400/1017104324028448#0

dict

dict 的定义与检索

即字典,有的语言也叫map,使用key-value 方式存储,和字典一样,一个key 对应一个value,具有快速查找的功能。

dict 用{} 定义,每组 key-value 通过,隔开,key-value 彼此用:连接。

定义一个成绩dict.

# a,b,c 三人成绩
score_dict = {'a' : 99, 'b' : 94, 'c' : 93}

dict 的原理和我们一般使用的字典一样,具备索引的功能,因此查找其中元素的速度非常之快。如我想要直到 c 的成绩,dict 在程序内部就会计算对应 c 的值的内存地址,就是94 所在的位置。

# 查看c 的成绩
score_dict['c']

由于key 与value 是一一对应的,因此若对于已定义的值重新赋值,则会覆盖原理的value。

而如果key 不存在,如上字典中,score_dict['d'] 则会报错。

为了避免报错可以使用两种方法。1)in。2)get。

in

可以通过'd' in score_dict进行检查。
结果会返回一个布尔值,True 即该key 存在字典中。

get

score_dict.get('d') ,若d 存在,则会返回d 对应的值,若不存在返回None

也可以对于不存在时返回的值自己定义,score_dict.get('d', 1),即d 不在字典时,返回1。

dict 与list 的区别

不难发现,dict 和list 还是挺像的。

都是存放一串的不同元素。只不过dict 不具备list 的顺序性,内部存放的顺序与key的放入顺序没有关系,并具备以下特点:
1)查找和插入速度极快,不受dict 长度影响。
2)占用空间大。
显然dict 是一种用空间换时间的方式。

哈希算法

dict 的key-value 计算方法本质是一种哈希算法,即根据key 来计算value 的位置,从而得到value 的具体值。

一旦相同的key 得到不同的value,则dict 就全乱了。因此只有不可变数据(字符串、整数、元组等)可以作为key,list 则不行。而且key 不可以重复。

set

set 是不存储value 的dict,可以理解成只有key 的字典。

set 通过list 作为输入集合。

s = set([1, 4, 3])

此时s 返回{1, 4, 3}

需要注意的是,即便传入的s 是一个list,可以list 只是作为set 的输入集合,因此set 的内部只是含有这个list 中的元素,它的本质还是一种dict,没有顺序。

因为dict 的key 是不可以重复的,因此set 也会自动过滤输入集合中的重复元素。

除了原理上,将set 看成没有value 的dict 外,set 还可以看成数学意义上的无序和无重复的集合,因此也可以通过set 做交集、并集的操作。

s1 = set([1, 2, 3])
s2 = set([2, 3, 4])
s1 & s2
{2, 3}
s1 | s2
{1, 2, 3, 4}

添加元素

通过s.add(key) 可以添加元素。

通过s.remove(ley) 可以删除元素。

不可变对象

之前提到过,列表中的key 必须为不可变元素,一旦为可变元素,则字典就乱套了。

试想一下,想要在字典上查一个单词,忽然发现15页也有,261页也有,结果还不知道其他页还有没有,这样下来,怎么找的到嘛!

对于可变对象,如list,我们可以使用append, insert, pop 或sort ,对list 进行操作,使其内部发生变换。

而对于不可变对象,如str ,也有个replace 方法。

a = 'abc'
b = a.replace('a', 'A')
b
'Abc'
a 
'abc'

但实际上,虽然replace 叫做替换,但并没有替换掉 a 的内容。
它只是在 a 变量的字符串对象基础之上,创建了一个新字符串对象,并用b 指向这个新的对象。


上一篇下一篇

猜你喜欢

热点阅读