Python之容器:字典(dict)就是哈希表换个马甲?
off999 2024-09-16 00:46 51 浏览 0 评论
引言
从上一篇文章开始,开始了Python中常用的数据结构,也就是容器类的介绍,上一篇文章简要介绍了列表的使用,这一篇文章准备介绍一下Python中字典(dict)的使用。
本文的主要内容大概如下:
1、简要介绍Python中字典的特点
2、遍历字典的几种方法
3、字典中的常用方法
4、字典推导式
Python中字典的特点
Python中的字典(dict)是一种非常强大的数据结构,对应到其他编程语言中的“哈希表”这种容器类型。
Python中的字典有如下特点:
1、键值对存储:便于通过键值快速检索、定位数据,比列表的索引方式更加方便。
2、关于顺序:在Python3.7之前,字典中的键值对是无序的。从Python3.7开始,字典中的键值对保持插入的顺序;但是,需要留意的是:自Python3.7开始,dict类型正式“有顺序”了,不过只是保留键的插入顺序。你不能随意重新排列dict中的键。
3、键的不变性:字典中的键必须是不可变的数据类型,比如(字符串、数字、元组),因为底层存储需要通过键进行哈希;值的类型是任意的。
4、可变性:字典是可变的,可以随时修改、添加和删除键值对。
字典的遍历
关于字典中最常用的一个操作,就是对字典的遍历,在Python中有几种常用的遍历方式,可以根据实际需要自行选择:
首先生成测试数据:
还是以人员信息为例,这次我们使用嵌套字典的方式存储,字典的key为name,字典的值为完整的人员信息的字典,包含name、age、gender、height
from faker import Faker
from rich import print
fk = Faker('zh_CN')
# 人员信息的测试数据
persons = {}
for _ in range(10):
name = fk.unique.name()
persons[name] = {'name': name, 'age': fk.random_int(1, 150), 'gender': fk.passport_gender(), 'height': fk.random_int(130, 200)}
print(persons)
执行结果:
需要注意的是,每次执行程序,生成的测试数据都是不一样的,所以,上面的执行结果只是一个示例。
方法1:遍历字典的键
for k in persons.keys():
print(k)
for k in persons:
print(k)
通过keys()方法进行遍历,与直接对persons进行遍历是一样的。
方法2:遍历字典的值
for p in persons.values():
print(p)
方法3:遍历字典的键值对:
for k, v in persons.items():
print(f"key: {k}, value: {v}")
字典常用方法
关于字典的增、删、改的操作比较简单,这里就不列举了。下面就几个在实际应用中,比较实用的方法做一下简单介绍。
1、根据可迭代对象初始化一个字典:fromkeys()
在实际使用中,有些数据可能是以其他形式存储的,我们在处理过程中,可能首先需要初始化一个字典,然后进行更进一步的处理:
比如,游戏开始之初,对玩家积分进行一个初始化的操作,后续根据游戏进度进行积分的动态更新
players = ['刘备', '关羽', '张飞', '赵云', '诸葛亮']
scores = dict.fromkeys(players, 0)
print(scores)
scores['赵云'] += 10
scores['诸葛亮'] += 100
print(scores)
执行结果:
2、获取字典中的值 get()
实际使用中,要通过键获取对应的值有两种方式:
1)通过[key]的形式
2)通过get()方法
两者的不同在于,[key]索引的形式,当键值不存在时会抛异常;get()方法,键值不存在时默认返回None,也可以设置指定的默认值。
players = ['刘备', '关羽', '张飞', '赵云', '诸葛亮']
scores = dict.fromkeys(players, 0)
print(scores)
scores['赵云'] += 10
scores['诸葛亮'] += 100
print(scores)
# 返回None
print(scores.get('赵云2'))
# 返回指定的默认值
print(scores.get('赵云2', -1))
# 会抛异常
print(scores['赵云2'])
执行结果:
3、setdefault()方法:
以一个简单的人员按照性别分组的需求为例,说明该方法的使用:
# 人员信息的测试数据
persons = {}
for _ in range(10):
name = fk.unique.name()
persons[name] = {'name': name, 'age': fk.random_int(1, 150), 'gender': fk.passport_gender(),
'height': fk.random_int(130, 200)}
print(persons)
persons_grop_by_gender = {}
for k, v in persons.items():
if v['gender'] in persons_grop_by_gender:
persons_grop_by_gender[v['gender']].append(k)
else:
persons_grop_by_gender[v['gender']] = [k]
print(persons_grop_by_gender)
上面的代码中,我们需要进行分支判断,如果key在字典中已经存在,则将姓名追加到值的列表中,如果不存在,则首次进行初始化为值列表的操作。
逻辑没有问题,但是,有点繁琐,不太pythonic!
接下来使用setdefault()方法进行改造:
persons_grop_by_gender = {}
for k, v in persons.items():
names = persons_grop_by_gender.setdefault(v['gender'], [])
names.append(k)
没有了分支判断的操作,相对简洁了一些。
执行结果:
字典推导式
如同通过列表推导式构造列表对象,Python也支持通过推导式构建字典对象。
字典推到式的语法类似于列表推导式,只需要把[]换为{},单个元素,换为kk: vv形式的元素即可。
如:
dict1 = {i: i**2 for i in range(20}
还是以上面的人员信息的测试数据生成为例,这次,我们改用字典推导式来实现:
from faker import Faker
from rich import print
fk = Faker('zh_CN')
# 人员信息的测试数据
persons = {(name := fk.unique.name()): {'name': name, 'age': fk.random_int(1, 150), 'gender': fk.passport_gender(), 'height': fk.random_int(130, 200)} for _ in range(20)}
print(persons)
执行结果:
可以看到,前面通过for循环生成的测试数据,现在通过字典推导式,只需要一行代码就搞定了。
相关推荐
- 产品密钥是什么意思(产品密钥有什么用处)
-
产品密钥是产品授权的证明,有了它才能使用这个产品。软件商在生产自己产品时,为每个产品输入一个序列号(注册号/密钥),如“KH2J9-PC326-T44D4-39H6V-TVPBY”,用户要通过这个序列...
- 电脑打不开一直重启(电脑打不开一直重启黑屏)
-
电脑一直反复启动的原因和解决方法有以下几点:1、电脑内存问题,可以尝试更换内存条。2、电脑主板问题,给主板放电即可。3、硬盘模式有误,更改回正确模式即可。4、硬盘驱动有更改,把刚安装的驱动卸载就可进入...
- win7 自动关机(win7自动关机设置)
-
具体解决方法/步骤如下:1、首先先摸一下主机箱,看看是不是很烫,打开机箱盖,看看主机电源和CPU散热器是不是不转了,一般电脑如果温度过高的话,硬件会开启保护措施,会自动关机,如果风扇不转了,建议立即更...
- 绿茶软件园官网(下载绿茶软件园)
-
就是,广告满天飞,评论都是刷的。
- 路由器密码锁解锁教程(路由器密码忘怎么设置)
-
1.路由器IP地址定位:通常而言,路由器在连接主网线之后,会广播一个自身的网络IP地址,一般如下:192.168.1.0,192.168.1.1,目前各大路由器厂商也会播出一些怪异的地址,比如10.1...
- 台式电脑键盘按键错乱怎么恢复
-
如果你的机械键盘按键错乱,你可以尝试将键盘连接到电脑上,然后通过按下“Ctrl”、“Alt”和“Del”键同时重启电脑,看看是否能够恢复默认设置。另外,你还可以尝试在控制面板中找到键盘设置,检查是否有...
- 移动硬盘格式化后还能用吗(移动硬盘格式化后数据会丢失吗)
-
当然可以使用!格式化只是里面的所有文件会没有,还可以再存储的。格式化(format)是指对磁盘或磁盘中的分区(partition)进行初始化的一种操作,这种操作通常会导致现有的磁盘或分区中所有的文件被...
- 手机系统升级好不好
-
手机系统并不是随时更新,都是好用的,手机主要针对你的处理器,如果老型使用年头比较多的手机,不建议更新系统,更新系统之后容易造成耗电量非常大,卡顿现象比较严重,而新出的手机产品处理器功率都偏大,这种手机...
- win2003序列号企业版(win2003 enterprise序列号)
-
Windows2003:JB88F-WT2Q3-DPXTT-Y8GHG-7YYQY cky24-q8qrh-x3kmr-c6bcy-t847y win2003EnterpriseServer:...
-
- 电脑c盘满了应该怎么办(如果电脑c盘满了怎么办啊)
-
1、电脑桌面双击此电脑2、进入后找到Windows(C)盘,然后鼠标右击选择属性3、点击磁盘清理4、勾选需要清理的文件,最后点击确定即可1、运用磁盘清理软件清理C盘,大约可为C盘释放50M-800M空间。2、关闭休眠功能,在开始菜单的运行里...
-
2025-12-18 11:03 off999
- win10桌面突然清空了(电脑桌面全部被隐藏了怎么恢复)
-
1、右键点击任务栏,然后选择任务管理器或按快捷键Ctrl+Shift+Esc; 2、打开任务管理器后,切换到详细信息模式。在进程中找到“桌面窗口管理器”(英文版系统找DesktopWindowM...
- 华硕笔记本全系列介绍(华硕笔记本全系列介绍视频)
-
关于这个问题,华硕笔记本一共有多个系列,每个系列定位不同。以下是华硕笔记本的主要系列及其定位:1.ASUSVivoBook(维沃系列):面向普通用户和学生,注重轻薄、时尚设计和价格实惠。2.AS...
- 华为笔记本电脑i5和i7区别(华为笔记本电脑i5和i7区别是什么)
-
主要是性能上的区别。如果将CPU比作火车运输,那么i5等于4条高铁,i7可以是6条或者8条高铁,运输量倍数增加。i7可以看作是i5的高配版。功能不同。i5和i7两个版本,其主要区别是在处理器的频率不...
欢迎 你 发表评论:
- 一周热门
-
-
抖音上好看的小姐姐,Python给你都下载了
-
全网最简单易懂!495页Python漫画教程,高清PDF版免费下载
-
Python 3.14 的 UUIDv6/v7/v8 上新,别再用 uuid4 () 啦!
-
飞牛NAS部署TVGate Docker项目,实现内网一键转发、代理、jx
-
python入门到脱坑 输入与输出—str()函数
-
宝塔面板如何添加免费waf防火墙?(宝塔面板开启https)
-
Python三目运算基础与进阶_python三目运算符判断三个变量
-
(新版)Python 分布式爬虫与 JS 逆向进阶实战吾爱分享
-
失业程序员复习python笔记——条件与循环
-
系统u盘安装(win11系统u盘安装)
-
- 最近发表
- 标签列表
-
- python计时 (73)
- python安装路径 (56)
- python类型转换 (93)
- python进度条 (67)
- python吧 (67)
- python的for循环 (65)
- python格式化字符串 (61)
- python静态方法 (57)
- python列表切片 (59)
- python面向对象编程 (60)
- python 代码加密 (65)
- python串口编程 (77)
- python封装 (57)
- python写入txt (66)
- python读取文件夹下所有文件 (59)
- python操作mysql数据库 (66)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python多态 (60)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)
