美文网首页
dict 与 set

dict 与 set

作者: Peng_001 | 来源:发表于2020-05-20 12:53 被阅读0次

    参考: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 指向这个新的对象。


    相关文章

      网友评论

          本文标题:dict 与 set

          本文链接:https://www.haomeiwen.com/subject/umtbohtx.html