最新公告
  • 欢迎您光临码农资源网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!加入我们
  • Python3的dict类型

    假设我们需要用一个数据结构来存储 3 万个汉字,如果我们使用 list 或 tuple 来存储,当我们查找某个汉字时,
    就需要从第一个成员开始一直找,直到我们能找到,或者到最后一个成员没有找到为止。

    dict 就是字典,其实现原理和我们使用的字典是一样的,假设我们使用 dict 来存储 3
    万个汉字,我们只需要在字典的索引表里查这个汉字对应的位置,就可以找到这个字,无论找哪个字,我们都可以一次性定位到该字,也就是时间复杂度为 o(1)。
    我们使用 dict 数据结构来存储汉字,查找速度不会随着汉字内容的多少而变化。

    对于我们前面学过的 str 类型,list 类型和 tuple 类型都可以通过下标访问里面的成员,
    而 Python 的 dict 是无序的集合(无法通过下标访问),但我们可以通过 dict 的键(key)来访问,key 就类似于有序集合的下标。

    dict 的定义

    dict 是 Python 内置的数据类型,在其它语言中一般属于非内置类型,是由第三方库或者程序员本身写的库,
    比如 c++ 中的 stl 库中的 map 和 Python 的 dict 类似,但实现方式不一样(c++ 的 map 用的是红黑树,Python
    用的是哈希表),Python 语言用 {} 来表示是一个 dict,每个成员是一个键-值(key-value)配对。

    student_dict = {'a': 1, 'b': 2, 'c': 3}  # 内存中顺序为 {'a': 1, 'c': 3, 'b': 2}
    print(student_dict)  #(注意:在 Python3.8 中, print 是按照用户创建 dict 的顺序输出,而不是内存顺序输出)

    dict 成员在内存中的顺序和定义时候的顺序不一定一样,这是由创建哈希表的算法(大家可自行搜索哈希表算法)
    决定的,哈希表的算法决定键的存放位置。

    mydict = {'a': 1, 'b': 2, 'c': 3}
    print(mydict['b'])
    print(mydict.get('b'))
    print(mydict['d'])      # 报异常
    print(mydict.get('d'))  # 返回 None

    dict 的增删改查

    我们知道 dict 是无序的,所以无法通过下标访问值,但我们可以通过 key 来访问该 key 对应的值,
    访问方式为 dict[key],但要确保 key 存在,不然会报异常;我们也可以使用 dict 的 get 函数获取 key
    对应的值,如果 key 不存在,则返回 None。

    mydict = {'a': 1, 'b': 2, 'c': 3}
    mydict['d'] = 4
    mydict['b'] = 5
    print(mydict)

    我们如果想给字典添加一个值,可以直接通过 dict[key] = value 的方式,如果 key
    已经存在的话,则是修改。

    mydict = {'a': 1, 'b': 2, 'c': 3}
    del mydict['b']
    print(mydict)
    mydict.pop('a')
    print(mydict)

    因为 dict 的每个成员都是键值配对,所以删除成员的时候,通过键删除值,整个成员就会删除掉,
    可以使用 Python 内置函数 del 或 dict 成员函数 pop 做删除操作,注意要确保删除的键存在,不然会报异常。

    mydict = {'a': 1, 'b': 2, 'c': 3}
    
    allkeys = mydict.keys()
    print(allkeys)
    print(type(allkeys))
    for key in allkeys:
        print(key)

    获取 dict 键,值,成员的函数

    dict 的 keys 函数获取 dict 所有成员的键放在一个 dict_keys 类型的对象中,这个对象是一个可遍历的集合,我们可以通过遍历这个对象,获取每一个键。

    mydict = {'a': 1, 'b': 2, 'c': 3}
    
    allvalues = mydict.values()
    print(allvalues)
    print(type(allvalues))
    for value in allvalues:
        print(value)

    dict 的 values 函数获取 dict 所有值放在一个 dict_values 类型的对象中,这个对象是一个可遍历的集合,我们可以通过遍历这个对象,获取每一个值。

    mydict = {'a': 1, 'b': 2, 'c': 3}
    
    allitems = mydict.items()
    print(allitems)
    print(type(allitems))
    for item in allitems:
        print(item)

    dict 的 items 函数获取 dict 所有的成员放在一个 dict_items 类型的对象中,这个对象是一个可遍历的集合,我们可以通过遍历这个对象,获取每一个成员。

    mydict = {'a': 1, 'b': 2, 'c': 3}
    
    allitems = mydict.items()
    print(allitems)
    print(type(allitems))
    for item in allitems:
        print(item)

    注意:在 Python 2 中,dict 还提供了 iter 系列函数(iter_keys 函数,iter_values 函数,iter_items
    函数)来获取 dict 的键,值和成员,并把他们放入迭代器中;而 Python2 的 keys 函数,values 函数和 items 函数则把取出的值放在一个 list 中。

    使用 dict 注意事项

    dict 的键就如有序集合的索引一样,dict 成员的键是不可以修改的。

    dict 成员的键就像索引一样是不可以重复的。

    mydict = {'a': 1, 'b': 2, 'c': 3}
    mydict['b'] = 4  # 只会修改键所对应的值
    print(mydict)

    因为 Python 的 dict 数据结构是采用 hash 算法构建的,hash 算法决定 key 的位置,
    所以 dict 成员的键是必须可以 hash 的,所有的常量都是可 hash 的,比如数字,字符串,bool值,None 等等,
    对于 tuple 来说,如果 tuple 的成员也都是可 hash 的则可以,否则不行。

    mydict = {}                         # 空的 dict
    mydict[-1.1] = "Hello"              # 数字
    mydict["babye"] = "babye"           # 字符串
    mydict[False] = "welcome"           # bool 值
    mydict[None] = "Python"
    mydict[(1, (2, 3))] = "老鸟python"  # 可哈希的 tuple
    mydict[[1, 2]] = "my god"           # [1, 2] 不可 hash
    mydict[{'a': 1}] = "my god"         # {'a': 1} 不可 hash
    mydict[(1, (2, [3,4]))]             # (1, (2, [3,4]) 不可 hash

    对 dict 成员的 key 进行增加,删除操作时,dict 的 hash 表的结构就会改变,
    成员的存储顺序就会发生变化,在遍历的时候就会出现混乱,因为已经遍历过的成员有可能再次被遍历等等(在循环章节我们再讲这个问题)。

    本节重要知识点

    dict 内部存储的数据结构。

    熟练使用 dict 增删改查。

    熟练使用获取 key,value 和 成员的函数。

    想要了解更多内容,请持续关注码农资源网,一起探索发现编程世界的无限可能!
    本站部分资源来源于网络,仅限用于学习和研究目的,请勿用于其他用途。
    如有侵权请发送邮件至1943759704@qq.com删除

    码农资源网 » Python3的dict类型
    • 7会员总数(位)
    • 25846资源总数(个)
    • 0本周发布(个)
    • 0 今日发布(个)
    • 293稳定运行(天)

    提供最优质的资源集合

    立即查看 了解详情