百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT知识 > 正文

Python之容器:字典(dict)就是哈希表换个马甲?

liuian 2025-02-19 12:55 54 浏览

引言

从上一篇文章开始,开始了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循环生成的测试数据,现在通过字典推导式,只需要一行代码就搞定了。


相关推荐

手机刷windows支持列表(能刷windows的手机)

1、首先,目前支持win11的手机型号也是有限制了,必须是使用骁龙865芯片的机型。2、目前常用的手机型号为小米8、小米MIX3、一加6、魅族16th、三星S9+等。3、确认我们的手机可以刷入win1...

鸿蒙系统怎么升级安装(鸿蒙系统怎样升级的)
鸿蒙系统怎么升级安装(鸿蒙系统怎样升级的)

手机升级成鸿蒙系统的方法步骤1、6月2日起,首批启动公测升级HarmonyOS2的设备包括:华为Mate40系列、Mate30系列、P40系列、MateX2、MatePadPro,只有这些设备可以自己进行系统更新...

2026-01-04 12:55 liuian

服务器查询网站入口(服务器查询网站入口官网)

1、单击电脑桌面“win”图标,在菜单中点击设置选项,进入设置页面;2、点击“网络和Internet”选项,接着点击左侧属性栏的“状态”选项;3、在页面中进入“网络和共享中心”页面,在页面中单击...

电脑玩游戏卡顿不流畅怎么解决

若想玩游戏流畅,就需要我们的电脑处于最流畅的情况,首先打开我们的电脑,在电脑主界面使用右键点击空白处,接着点击选择“NVIDIA控制面板”,进入对显卡的设置页面。然后在控制面板中,我们需要选择3D设置...

win7网络共享在哪(win7系统网络共享)

要设置Win7的局域网共享,首先要确保所有电脑都连接到同一个网络,并且网络类型设置为“家庭网络”或“工作网络”。然后,在“控制面板”中选择“网络和共享中心”,点击“高级共享设置”,启用文件和打印机共享...

cpu实时数据多少正常(cpu时间多少正常)

当手机的运算量没有那么大时,如待机的时候,系统就会在允许的范围内降低处理器频率,0.8GHz=800MHz操作方法如下:1.第一步,打开手机并在桌面找到设置图标,点击进入。2.第二步,进入设置页面后...

桌面助手下载(添加桌面助手)
桌面助手下载(添加桌面助手)

下载了桌面助手不好用的原因可能有很多,以下是一些常见的问题和解决方法:安装问题:请确保你已经按照正确的步骤安装了桌面助手。如果你在安装过程中遇到了问题,可能会导致桌面助手无法正常使用。兼容性问题:如果你使用的桌面助手与你的操作系统或硬件设备...

2026-01-04 10:05 liuian

sql server 2005安装教程(sql server 2005安装教程win10)

错误代码:0x851A001A(winserver2012r2域环境下安装sql2012sp1后报错)解决方法:把启动Databaseengine的帐户改为NTAuthority\Netwo...

win7快速启动栏文件夹(win7快速启动栏显示桌面图标)

Win7的开机启动程序在C:Users用户名AppDataRoamingMicrosoftWindowsStartMenuProgramsStartup文件夹里,具体找到该文件夹的步骤如下:1、...

卸载win10系统重装win7(卸载win+r)

解决方法如下:1、使用老毛桃制作U盘启动盘;2、使用该U盘启动计算机,进入其diskgenuis分区工具;3、点击硬盘,点击清除保留扇区命令;4、再点击重建主引导记录命令;5、按F6,快速分...

win10开机转圈时间长(windows10开机转圈很久)

1、首先需要按win+R打开电脑,进入msconfig,点击确定。2、接下来,进去之后,点击工具。3、进入后,选择更改UAC设置,然后单击开始。4、进去后,把滑块调到最低。5、接下来,您需要将滑块调整...

台式电脑处理器天梯图(笔记本电脑处理器性能天梯图)

第一名:Intel酷睿i54590  这一款处理器的核心数量为四核,主频为3.3GHz,带有6M的三级缓存,运行的速度很快,接口类型为LGA1150,性价比较高,市面上的价格为1254元。  第二...

安装win10专业版(安装win10专业版要钱吗)

win10专业版驱动安装方法步骤如下  1、右击【此电脑】,点击【属性】。  2、点击【设备管理器】。  3、点击【网络适配器】。  4、找到【Intel(R)DualBandWireless-...

thinkpad开不了机怎么解决(thinkpad笔记本开不了机怎么解决)

1.笔记本电源电量不足。这种情况是由于过量使用笔记本或长时间待机电池用电过量形成的,只要在使用前多充会电就会解决这个问题。2.开机时没有任何反映。这类情况一般最多的是硬件松动或笔记本进水形成的。如果是...

无线上网设备哪个好(无线网络哪个好)

要重置WiFi设备的网络,首先需要找到设备上的重置按钮或者重置选项。通常,这个按钮或选项会在设备的背面或底部,或者在设备的设置菜单中。按下重置按钮或选择重置选项后,设备会恢复到出厂设置,所有网络设置和...