Python 字典及常见应用(Python Dctionary)

news2024/9/22 23:32:27

字典是python的内置基本数据类型之一,其他语言中可能会被称为“关联存储”或“关联数组”。它是一种映射关系,以包含在{}中的"键:值"对表示。字典是一种可变对象,键没有顺序。其主要用途是通过关键字存储、提取值。

目录

一、字典的创建

1.1 常量方式创建

1.2 使用类构造器dict创建

1.3 使用字典推导式创建

二、常用字典方法

三、常见字典应用

3.1 有序字典

3.1.1 使用列表的sort方法

3.1.2 使用sorted函数

3.1.3 使用collections.OrderedDict容器数据类型

3.2 多值字典

3.2.1 使用容器类型作为值

3.2.2 使用collections.defaultdict容器数据类型

3.3 键值反转


一、字典的创建

字典有很多种创建方式,你可以直接以常量方式编写,或使用类构造器或字典推导式来创建字典。

1.1 常量方式创建

字典是以{}包围的键值对,键和值以冒号分隔,键值对之间以逗号分隔,按这种格式可以直接编写出字典。

直接输入{}就初始化了一个空字典:

d = {}
type(d)

创建字典的同时输入键值:

d = {'Vincent':1, 'Victor':2, 'Grace':3}
type(d)

python中的另一种数据结构集合(Set)也是包含在{}中的,集合是唯一不可变对象的无序集合,但{}创建的是空字典,空集合必须要用set函数来创建。

s = set(['a', 'b', 'a'])

  • 创建集合过程中,重复值"a"只保留一个,集合可以看作是没有值的字典。

1.2 使用类构造器dict创建

类构造器dict也可以创建字典,且兼容的输入形式更多。

直接调用dict()即初始化了一个空字典:

d = dict()
type(d)

可以用多种形式给dict()提供键值对,如:key=value, [(key, value) …] , zip()等,下面4种方式创建出来的字典是一样的:

d1 = dict(Vincent=1, Victor=2, Grace=3)

d2 = dict( [('Vincent', 1), ('Victor', 2), ('Grace', 3)] )

d3 = dict( zip(['Vincent', 'Victor', 'Grace'], [1, 2 ,3]) )

d4 = dict( {'Vincent':1, 'Victor':2}, Grace=3 )

  • 注意用第一种方式key=value,键是没有引号的。

1.3 使用字典推导式创建

字典推导式和列表与集合的推导式类似,它包含在{}中,需要以冒号分隔的2个变量,后面跟上for和if子句(if子句可省略),推导式会执行for循环将求得的值依次加入字典。

求10以内偶数的2次幂,并保存到字典中:

d = {x:x**2 for x in range(10) if x%2==0}

  • range(10)返回0~9共10个数字,for会在这10个数中循环,判断if条件,满足的则计算并加入字典中

字典推导式另一个常见的用法是从其他字典中筛选子集,例如从d1中筛选value小于3的记录,保存一个子集:

d1 = dict(Vincent=1, Victor=2, Grace=3)

d5 = {k:v for k,v in d1.items() if v<3}    # 字典推导式

d5

二、常用字典方法

字典提供了非常丰富的方法,部分常用的如下(d代表字典对象):

  • d.keys(),d.values(),d.items() 分别返回由键、值、(键, 值)组成的可迭代对象,可以遍历字典的键,值,和键值对
  • d[key] 返回d中键为key的值,如果key不存在,则会引发KeyError。也可以用于字典赋值。
  • key in d 测试键key是否在d中,存在返回True,否则返回False
  • list(d) 返回d中所有键组成的列表
  • len(d) 返回d中项目数,一个键值对算一项
  • d.get(key [, default]) 如果key存在则返回key的值,否则返回default,常用在累加统计场景,可以避免KeyError异常
  • d.pop(key [, default]) 如果key存在则移除并返回key的值,否则返回default,适用于字典的消耗性迭代
  • d.popitem() 从字典中移除并返回一个(键, 值)组成的元组,键值对会按LIFO的顺序返回,适用于字典的消耗性迭代

通过d.keys()遍历字典键,并使用d[key]获取键对应的值:

for k in d1.keys():
    print(k,'=>' ,d1[k])

  • 由于字典本身就是一个可迭代对象,因此keys()可以省略,for k in d1.keys(): 可以直接写成 for k in d1:

上面的示例也可用d.items()改写为,items()会以元组的方式返回键值对,需要2个参数:

for k,v in d1.items():
    print(k, '=>', v)

get(key [, default]) 可以在key不存在时可以返回默认值而不是引发KeyError,这个特点非常适合用在统计场景,例如统计文章中每个单词出现的次数(这里用一句话代替):

str = "How Many Cookies Could a Good Cook Cook if a Good Cook Could Cook Cookies?"

l = str.split(' ')    # 用空格拆分单词,得到单词的列表,这里没有去除标点

d = {}    # 构造一个空字典,用于存储单词及计数

for word in l:
    d[word] = d.get(word, 0) + 1

  • d.get(word, 0) 在键word首次出现(即键不存在时),不会引发KeyError,而是会返回0,同时通过d[word]赋值将该键加到字典中
  • d[word] = d.get(word, 0) + 1,方法d.get(word, 0)在获取d[word]的值后,加1后又赋值回去,实现单词的累加统计。

d.pop(key [, default])和d.popitem() 是消耗性迭代,一个返回值,一个返回键值对组成的元组,用法类似。

三、常见字典应用

字典的应用场景非常广泛,变化也非常多,下面介绍排序,多值映射,键值反转场景。

3.1 有序字典

Python原生的字典对象是无序的,如果我们确实需要强调某种顺序的时候,可以使用某些方法来使字典保持有序。

3.1.1 使用列表的sort方法

一个常用的方法就是通过列表来进行间接排序(列表是有序的)。例如需要按键排序,可以先将字典键收集到列表中,使用列表的sort方法对键值排序,然后使用for循环遍历显示结果。

d = dict(d=4, b=2, a=1, c=3)
ks = list(d.keys())
ks.sort()

for key in ks:
    print(key, '=>', d[key])

3.1.2 使用sorted函数

也使用sorted内置函数一步完成,sorted()函数会对可迭代对象排序,并返回一个列表。由于字典本身就是可迭代对象,因此sorted(d)会直接返回排序后的键列表,我们直接遍历即可:

d = dict(d=4, b=2, a=1, c=3)

for key in sorted(d, reverse=True):
    print(key, '=>', d[key])

  • 这里用了reverse=True定义降序遍历,如果要升序遍历,省略reverse关键字即可。

3.1.3 使用collections.OrderedDict容器数据类型

上面两种方法都是借助了其他有序的数据类型,在遍历字典时实现间接排序,如果想要字典本身保持有序,可以借助python标准库中的collections.OrderedDict。

这是dict的一个字类,可以用于构造有序字典。有序字典被设计用在强调排序的场景,例如在构造JSON这种需要保持顺序的数据时非常有用,其在效率上不如常规字典(有序字典内部会额外维护双向链表来保持元素顺序)。

有序字典构造方法和dict一样,但OrderedDict()会根据元素加入顺序来排列键值对:

from collections import OrderedDict
d = OrderedDict(a=1, b=2, c=3)

d

OrderedDict也可以通过popitem()方法来返回并移除一个键值对,默认按LIFO先进后出方式从尾部返回键值对:

d.popitem()

通过参数last=False使用FIFO先进先出的方式从头部返回键值对:

d.popitem(last=False)

有序字典通过move_to_end(key [,last=True])方法还可以将指定元素移动到开头或结尾,默认将指定键值对移动到字典的结尾:

d.move_to_end('a')

如果last参数被设置为False,则会移动开头:

d.move_to_end('c', last=False)

3.2 多值字典

通常情况下,键和值是一对一的关系。如果要实现一个键对应多个值,我们需要将多个值包装成一个整体(放入其他容器类型中)作为值。

3.2.1 使用容器类型作为值

我们可以将多个值放在其他容器类型中(列表/集合等),以一个整体作为值,如果需要保持多个值的顺序就用列表,需要保持值唯一就用集合:

d1= dict(a=[1,2,1], b=[4,5,6], c=[7,7,7])

d2= dict(a={1,2,1}, b={4,5,6}, c={7,7,7})

由于值是列表类型,可以使用列表的方法来修改值:

d1['a']

d1['a'].append(4)

d1['a']

上面的示例是采用常量的方法将值编写为列表/集合的容器类型,但对于不存在的键,其值类型是未知的,无法直接调用列表/集合方法来添加值:

d1['x'].append(1)    # 报错

你需要先初始化值的类型,才能调用相应的方法:

d1['x'] = []

d1['x'].append(1)

3.2.2 使用collections.defaultdict容器数据类型

python的标准库提供了collections.defaultdict()来帮助你更方便的建立多值字典,其在初始化时可以指定值的容器类型。即默认的dict()构造的是"键-值"对,而collections.defaultdict(list)可以构造"键-列表"对或collections.defaultdict(set)构造"键-集合"对。

例如,构造一个键-列表对,对于值可以对值直接调用列表方法:

from collections import defaultdict

d3 = defaultdict(list)

d3['x'].append(1)

或构造一个键-集合对,方式也一样:

d4 = defaultdict(set)

d4['y'].add(1)

通过使用defaultdict,可以省去每次新增一个键,都要显式声明其值的容器类型的操作。

3.3 键值反转

字典的反转键值只需要分别将键(d.keys())和值(d.values())提取出来,通过zip函数构造出"值-键"对,即可实现键-值反转。

zip函数会在多个可迭代对象上并行迭代,并从每个迭代对象返回一个元素组成元组,例如:

z = zip(['a','b','c'], [1,2,3])

z

zip函数返回的也是一个可迭代对象,可以通过for循环进行遍历:

for k in z: print(k)

注意可迭代对象是消耗性的,遍历一次后就没了,如果要再次使用,需要使用zip函数重新构造:

for k in z: print(k)

  • 第二次遍历,发现z空了

了解了zip函数的功能,可以很方便通过d.keys(), d.values()和zip函数构造出一个键值反转的字典:

d5 = dict(a=1, b=2, c=3)

d5_reversed = dict(zip(d5.values(),d5.keys()))    # d5.values()在前,d5.keys()在后

d5_reversed

其他的方面的字典应用,如求交集,差集,最大值,最小值等,大多数都是围绕d.keys(), d.values(), d.items()这3个函数做文章,大家可以自行尝试。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1421326.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

3分钟搞定幻兽帕鲁联机,一键部署专属服务器

3分钟搞定幻兽帕鲁联机&#xff0c;一键部署专属服务器 访问帕鲁专题活动页 登录阿里云官网&#xff0c;用钉钉或者支付宝app扫码注册新用户&#xff08;新用户福利较多&#xff0c;优惠力度大&#xff09; 进入阿里云游戏联机服务器专题页&#xff0c;点击 一键购买及部署 即可…

记录一条sql查询:以逗号隔开的id字符串的查询

目录 前言表结构sql语句 前言 在一个项目中有两张表&#xff0c;一张是商品码表&#xff0c;一张是记录出库单明细的出库记录表&#xff0c;记录表中有一个字段保存了以逗号隔开的商品码表的id字符串&#xff0c;需要根据出库明细id查找到对应出库的商品码。 表结构 goods_det…

TypeScript(六) 循环语句

1. TypeScript循环语句 1.1. 简述 有的时候&#xff0c;我们可能需要多次执行同一块代码。一般情况下&#xff0c;语句是按顺序执行的&#xff1a;函数中的第一个语句先执行&#xff0c;接着是第二个语句&#xff0c;依此类推。   循环语句允许我们多次执行一个语句或语句组…

【开源】JAVA+Vue.js实现大学兼职教师管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、研究内容三、界面展示3.1 登录注册3.2 学生教师管理3.3 课程管理模块3.4 授课管理模块3.5 课程考勤模块3.6 课程评价模块3.7 课程成绩模块3.8 可视化图表 四、免责说明 一、摘要 1.1 项目介绍 大学兼职教师管理系统&#xff0c;旨…

阿里云0基础1分钟搞定幻兽帕鲁游戏联机服务器搭建

幻兽帕鲁&#xff08;Palworld&#xff09;是一款备受欢迎的多人在线角色扮演游戏&#xff0c;让玩家可以与其他玩家一起探索、组队和战斗。为了能顺畅地体验游戏&#xff0c;搭建一个高效、稳定的游戏服务器至关重要。阿里云提供快速、简化的服务器搭建方案&#xff0c;新手小…

代码随想录 Leetcode112. 路径总和

题目&#xff1a; 代码(首刷看解析 2024年1月30日 递归回溯 逻辑清晰版&#xff09;&#xff1a; class Solution { public:bool traversal(TreeNode* cur,int sum) {if (!cur->left && !cur->right && sum 0) return true;if (!cur->left &&am…

iOS 17.4 苹果公司正在加倍投入人工智能

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

开发AI软件,构建多用户AIGC系统,实现图文创作及源码交付

在AI技术不断进步的今天&#xff0c;AI软件开发已成为一个热门的领域。而多用户AIGC系统作为AI软件开发的重要项目之一&#xff0c;呈现出极大的潜力和前景。 多用户AIGC系统旨在为用户提供一个全面的图文创作平台&#xff0c;借助AI的力量&#xff0c;使创作过程更加智能化和…

代码随想录算法训练营DAY7 | 哈希表(2)

一、LeetCode 454 四数相加II 题目链接&#xff1a;454.四数相加IIhttps://leetcode.cn/problems/4sum-ii/description/ 思路&#xff1a;建立HashMap&#xff0c;Key存储nums1、nums2数对之和&#xff0c;Value存储数对和出现次数&#xff0c;再遍历nums3、nums4数对确定答案…

研学活动报名平台源码开发方案

一、项目背景与目标 &#xff08;一&#xff09;项目背景 研学活动报名平台旨在为活动组织者提供方便快捷的研学活动管理工具&#xff0c;同时为用户提供全面的活动搜索、报名和支付等功能。通过该系统&#xff0c;活动组织者能够更好地管理活动报名信息&#xff0c;用户也可…

【Lazy ORM 整合druid 实现mysql监控】

Lazy ORM 整合druid 实现mysql监控 JDK 17 Lazy ORM框架地址 up、up欢迎start、issues 当前项目案例地址 框架版本描述spring-boot3.0.7springboot框架wu-framework-web1.2.2-JDK17-SNAPSHOTweb容器Lazy -ORM1.2.2-JDK17-SNAPSHOTORMmysql-connector-j8.0.33mysql驱动druid-…

自动化测试接口测试前的【准备及思路】

1、什么是接口测试 客户端&#xff08;前端&#xff09;与服务端&#xff08;后端&#xff09;的关系&#xff0c;一般小编会理解为“服务端负责赚钱养家&#xff0c;客户端负责貌美如花”。客户端更注重的是功能呈现及用户体验&#xff0c;怎么将强大的功能精彩的界面呈现给不…

代码随想录算法训练营第35天 | 860.柠檬水找零 406.根据身高重建队列 452.用最少数量的箭引爆气球

柠檬水找零 局部最优&#xff1a;收到20元时优先找零10元5元&#xff0c;不够再找零3个5元&#xff0c;因为5元可以找零20和10&#xff0c;更有用。全局最优&#xff1a;完成所有的找零。 class Solution { public:bool lemonadeChange(vector<int>& bills) {int fi…

84 C++对象模型探索。数据语义学 - 继承多个类的时的数据布局问题。

此章节分析多继承问题&#xff0c;难点&#xff0c;但是非重点&#xff0c;实际开发中&#xff0c;多继承用的很少&#xff0c;容易被code review&#xff0c;可以不看。 我们要访问一个类对象中的成员 成员的定位是通过如下两个因素决定的&#xff1a;this指针(编译器会自动调…

数字身份保护:Web3如何改变个人隐私观念​

随着Web3时代的来临&#xff0c;数字身份保护成为人们关注的焦点之一。Web3技术的引入不仅为个人隐私带来了新的挑战&#xff0c;同时也为我们重新思考和改变个人隐私观念提供了契机。本文将深入探讨Web3如何改变个人隐私观念&#xff0c;以及在数字身份保护方面的创新举措。 1…

springboot中获取配置文件中属性值的几种方式

目录 第一章、使用Value注解第二章、使用PropertySource注解第三章、使用Configurationproperties注解第四章、使用Java Properties类第五章、使用Environment接口 友情提醒: 先看文章目录&#xff0c;大致了解文章知识点结构&#xff0c;点击文章目录可直接跳转到文章指定位置…

财务数据可视化大屏:企业决策的智慧之眼

在大数据时代&#xff0c;财务数据的管理与分析对于企业的决策和发展至关重要。然而&#xff0c;面对海量的数据&#xff0c;如何快速、准确地获取有价值的信息&#xff0c;一直是企业面临的挑战。这时&#xff0c;财务数据可视化大屏的出现&#xff0c;为企业提供了一个全新的…

VS2019卸载VA插件之后,出现闪退时

https://learn.microsoft.com/zh-cn/visualstudio/ide/reference/safemode-devenv-exe?viewvs-2022 采用安全模式进入VS。 以管理员运行VS2019命令行窗口&#xff1a; 进入VS界面后&#xff0c;再关掉&#xff0c;重新按正常方式打开VS界面即可

webassembly003 TTS BARK.CPP-02-bark_tokenize_input(ctx, text);

bark_tokenize_input函数 bark是没有语言控制选项的&#xff0c;但是官方的版本无法运行中文bark_tokenize_input会调用bert_tokenize函数&#xff0c;bark_tokenize_input函数对中文分词失效&#xff0c;也就是导致不支持中文的原因。 void bark_tokenize_input(struct bark_…

File、IO流(一)

File、IO流 File File是Java.io包下的类&#xff0c;File类的对象&#xff0c;用于代表当前操作系统的文件&#xff08;可以是文件、或者文件夹&#xff09;。 注意&#xff1a;File类只能对文件本身进行操作&#xff0c;不能读写文件里面存储的数据。 IO流 用于读写数据的&…