Python3的dict类型 - vip共享吧
  • 网站首页
  • IT技术笔记
    • Java教程
    • MySql数据库
    • PHP开发
    • Python教程
    • JavaScript
    • SEO优化
    • 常用工具
  • 好资源福利
    • 会员账号共享
  • 网站模板源码
    • 小程序源码
    • 网站源码
  • 共享网络资源
  • 更多功能
    • 留言吐槽
    • 文章归档
    • 我的邻居
    • 史上今日
    • 视频解析
    • 高清壁纸
    • 公告动态
    • 广告合作
    • 关于我们


导航菜单
  • 网站首页
  • IT技术笔记
    • Java教程
    • MySql数据库
    • PHP开发
    • Python教程
    • JavaScript
    • SEO优化
    • 常用工具
  • 好资源福利
    • 会员账号共享
  • 网站模板源码
    • 小程序源码
    • 网站源码
  • 共享网络资源
  • 更多功能
    • 留言吐槽
    • 文章归档
    • 我的邻居
    • 史上今日
    • 视频解析
    • 高清壁纸
    • 公告动态
    • 广告合作
    • 关于我们
Python

Python3的dict类型

2024/9/6 韩俊  Python教程 529 0

假设我们需要用一个数据结构来存储 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 和 成员的函数。

点赞:0 分享

上一篇
MySQL连接数怎么优化和配置
下一篇
Python3的tuple类型
作者头像 作者名称 作者性别
韩俊

热门推荐

1 Python3的set类型
2 Python自定义模块
3 Python中hashlib模块详解
4 Python中itertools模块如何使用
5 Python中@property的介绍与使用
6 python3闭包函数

评论列表

取消回复

    •  
      Login

      韩俊

      趁你现在还有时间,尽你自己最大的努力,努力做成你最想做的那件事,成为你最想成为的那种人,过着你最想过的那种生活。这个世界永远比你想的要更精彩,不要败给生活。

      退出登陆
      • 10076文章
      • 455评论
      • 80微语
  • 广告赞助

  • 二零二五年07月
    一二三四五六日
     123456
    78910111213
    14151617181920
    21222324252627
    28293031   
  • 分类

    • 网站模板源码
    • IT技术笔记
    • 好资源分享
    • 共享网络资源
  • 最新文章

      • 分享各大最新影视资源采集站网址合集资源共享
        • 经典的黄句子
          • 迷雾通:免费使用的VPN软件
            • 宝塔如何配置SSH密钥,并使用WinSCP工具远程连接服务器
              • 女人高情商祝福语简短
                • 京东外卖商户入驻指南及详细入驻攻略
                  • git教程及git常用命令指南
                    • 七一活动经典句子
  • 热门文章

    • 酷狗音乐VIP账号 酷狗音乐会员账号共享2017.01.29更新
    • 芒果tv vip会员账号 芒果tv会员账号共享2017.01.29更新
    • 爱奇艺vip账号 爱奇艺/PPS会员账号共享2016.12.12更新
    • 优酷/土豆vip会员账号 优酷会员账号共享2017.01.29更新
    • 活动:免费获得爱奇艺VIP/PPS会员账号50天以上的使用权!
    • 酷我音乐VIP账号 酷我音乐会员账号共享2016.12.31更新
    • 暴风影音会员账号 暴风影音会员账号共享2016.12.31更新
    • m1905会员账号 m1905会员账号共享2016.10.21更新
  • 最新评论

    • https://www.vipshare8.com/content/templates/meta/Static/images/tx/10.jpg

      你丫的 文章写得太好了 支持下!![F3...

    • https://www.vipshare8.com/content/templates/meta/Static/images/avatar.jpg

      很棒!刚在某网站看到这个,很欣赏,可惜下...

    • https://www.vipshare8.com/content/templates/meta/Api/qqtx.php/?qq=3861064027

      呃呃呃 oooo

    • https://www.vipshare8.com/content/uploadfile/202103/thum-490d1614564497.png

      回复了111:根据激活的时间有一年的有效期!

    • https://www.vipshare8.com/content/templates/meta/Api/qqtx.php/?qq=792480561

      到2025就到期了吗?

    • https://www.vipshare8.com/content/uploadfile/202103/thum-490d1614564497.png

      [blockquote]打卡时间:16:...

    • https://www.vipshare8.com/content/templates/meta/Static/images/tx/7.jpg

      俊哥,想借用迅雷一用!但需要手机验证!看...

    • https://www.vipshare8.com/content/templates/meta/Api/qqtx.php/?qq=3293901900

      感谢大大的分享

    • https://www.vipshare8.com/content/uploadfile/202103/thum-490d1614564497.png

      回复了好奥v:如果没有解析成功,可以切换接口...

    • https://www.vipshare8.com/content/templates/meta/Api/qqtx.php/?qq=131241242441

      现在视频解析网站怎么用不了啦?

  • 网站统计 I 当前在线:833人

    • 本站管理:1位
    • 用户总数:593位
    • 置顶文章:2篇
    • 日志总数:10076篇
    • 微语总数:80条
    • 评论总数:455条
    • 标签总数:83条
    • 页面总数:8页
    • 分类总数:14个
    • 链接总数:16条
    • 运行天数:3720天
    • 最后更新:7月1日
    • 登录
    • 注册
    • 找回
    Copyright © 2025vip共享吧网站地图 网站备案豫ICP备19004194号-1

    免责声明:本站资源仅供用于学习和交流,本站部分素材内容来源于网络,如有侵权/投稿等,请及时联系站长.

    • 首页
    • 秒懂百科 秒懂百科
    • 搜索
    • 史上今日

    大家都在搜

    • 秒懂百科
    • 全民娱乐
    • 起点vip账号共享
    • 飞卢小说会员账号
    • seo优化
    • VIP电影
    • sem优化
    • 开发工具
    • 经典句子
    • 爱奇艺vip账号
    • 喜马拉雅FM会员账号
    • 百度文库下载
    • pptv
    • 好省
    • swoole
    • 芒果视频
    • 
    • 