当前位置: 首页 > news >正文

3 python基本语法 - Dict 字典

Python 中字典(dict)是一种无序的、可变的序列,它的元素以“键值对(key-value)”的形式存储。相对地,列表(list)和元组(tuple)都是有序的序列,它们的元素在底层是挨着存放的。字典中,习惯将各元素对应的索引称为键(key),各个键对应的元素称为值(value),键及其关联的值称为“键值对”。
在这里插入图片描述
在这里插入图片描述

1 字典的创建

1.1 通过大括号 {} 创建字典。

由于字典中每个元素都包含两部分,分别是键(key)和值(value),因此在创建字典时,键和值之间使用冒号 : 分隔,相邻元素之间使用逗号 , 分隔,所有元素放在大括号 {} 中,格式为:

dictname = {'key':'value1', 'key2':'value2', ..., 'keyn':valuen}

其中 dictname 表示字典变量名,keyn : valuen 表示各个元素的键值对;字典的键可以是整数、字符串或者元组,只要符合唯一和不可变的特性就行,字典的值可以是 Python 支持的任意数据类型。

dict1 = {"年龄": 20, "姓名": "小明"}
print(type(dict1))
dict2 = {1: 20, 2: 30, 3: "六十"}
print(type(dict2))
dict3 = {1: (1, 2, 3), 2: [1, 2, 3], 3: "六十"}
print(type(dict3))
'''
<class 'dict'>
<class 'dict'>
<class 'dict'>
'''

1.2 通过 fromkeys 函数创建字典

Python 中,可以使用 dict 字典类型提供的 fromkeys 函数创建带有默认值的字典,语法格式为:

dictname = dict.fromkeys(list,value=None)

其中,list 参数表示字典中所有键的列表(list),value 参数表示默认值,如果不写,则为空值 None。

list1 = ["语文", "数学", "英语"]
dict1 = dict.fromkeys(list1)
print(dict1)
dict2 = dict.fromkeys(list1, 90)
print(dict2)
'''
{'语文': None, '数学': None, '英语': None}
{'语文': 90, '数学': 90, '英语': 90}
'''

1.3 通过 dict 函数创建字典

  • 向 dict 函数传入列表或元组,而它们中的元素又各自是包含 2 个元素的列表或元组,其中第一个元素作为键,第二个元素作为值:
demo1 = [('two', 2), ('one', 1), ('three', 3)]
demo2 = [['two', 2], ['one', 1], ['three', 3]]
print(dict(demo1))
print(dict(demo2))
'''
{'two': 2, 'one': 1, 'three': 3}
{'two': 2, 'one': 1, 'three': 3}
'''
  • 通过应用 dict 函数和 zip 函数,可将两个列表、元组、集合、字符串,甚至还可以将 range
    区间转换为对应的字典,语法格式为:dictname = dict(zip(keys, values) ):
keys1 = ["two", "one", "three"]
values1 = (2, 1, 3)
values2 = range(0, 3)
dict1 = dict(zip(keys1, values1))
dict2 = dict(zip(keys1, values2))
print(dict1)
print(dict2)
'''
{'two': 2, 'one': 1, 'three': 3}
{'two': 0, 'one': 1, 'three': 2}
'''

2 字典的访问

2.1 直接访问

因为字典中的元素是无序的,每个元素的位置都不固定,所以字典也不能像列表和元组那样,采用切片的方式一次性访问多个元素。字典可以通过键来直接访问对应的值,语法格式为:dictname[key],其中,dictname 表示字典变量的名字,key 表示键名,注意,键必须是存在的,否则会抛出异常。

2.2 通过 get 函数访问

Python 更推荐使用 dict 类型提供的 get 函数来获取指定键对应的值。当指定的键不存在时,get 函数不会抛出异常,语法格式为:dictname.get(key_obj, defaultvalue),其中,dictname 表示字典变量的名字;key_obj 表示指定的键;defaultvalue 用于指定要查询的键不存在时,此方法返回的默认值,如果不手动指定,会返回 None。

dict1 = {'语文': 85, '数学': 96, '英语': 92}
print(dict1["语文"])
print(dict1["物理"])
print(dict1.get("语文"))
print(dict1.get("物理"))
print(dict1.get("物理", "值不存在"))
'''
85
Traceback (most recent call last):File "D:\code\pythonDev\test\main.py", line 3, in <module>print(dict1["物理"])
KeyError: '物理'
'''

2.3 通过 setdefault 函数访问

Python 字典中 setdefault 函数可以使用指定的键返回项目的值,和 get 函数类似, 如果键不存在于字典中,将会添加键并将值设为默认,语法格式为:dictname.setdefault(key_obj, defaultvalue)

其中, dictname 表示字典名称,key_obj 表示目标键值对对应的键,defaultvalue 表示默认值(可以不写,不写的话是 None),当指定的 key_obj 不存在时,setdefault 函数会先为这个不存在的 key_obj 设置一个默认的 defaultvalue,然后再返回 defaultvalue,如果该 key_obj 存在,那么直接返回该 key_obj 对应的 value。

dict1 = {'one': 100, 'two': 200, 'three': [100, 200, 300]}
print(dict1.setdefault("one"))
dict2 = {'one': 100, 'two': 200, 'three': [100, 200, 300]}
print(dict2.setdefault("one", 0))
dict3 = {'one': 100, 'two': 200, 'three': [100, 200, 300]}
print(dict3.setdefault("four"))
dict4 = {'one': 100, 'two': 200, 'three': [100, 200, 300]}
print(dict4.setdefault("four", 400))
print(dict4.get("four"))
'''
100
100
None
400
400
'''

2.4 字典中键值对的添加

为字典添加新的键值,直接给不存在的 key 赋值即可,语法格式为:

dictname[key_new] = value_new

其中,dictname 表示字典名称,key_new 表示新的键,value_new 表示新的值,只要是 Python 支持的数据类型都可以。

dict1 = {'语文': 85, '数学': 96, '英语': 92}
dict1["物理"] = 86
print(dict1)
'''
{'语文': 85, '数学': 96, '英语': 92, '物理': 86}
'''

2.5 字典中键值对的修改

Python 字典中键(key)的名字不能被修改,只能修改值(value)。字典中各元素的键必须是唯一的,因此,如果新添加元素的键与已存在元素的键相同,那么键所对应的值就会被新的值替换掉,以此达到修改元素值的目的。

dict1 = {'语文': 85, '数学': 96, '英语': 92}
dict1["数学"] = 100
print(dict1)
# ==> {'语文': 85, '数学': 100, '英语': 92}

2.6 字典的删除和字典中键值对的删除

字典的删除:和删除列表、元组一样,手动删除字典也可以使用 del 语句,语法格式为:del dictname,其中,dictname 表示要删除的字典名称。

dict1 = {'语文': 85, '数学': 96, '英语': 92}
del dict1
print(dict1)
'''
Traceback (most recent call last):File "D:\code\pythonDev\test\main.py", line 3, in <module>print(dict1)
NameError: name 'dict1' is not defined
'''

字典中键值对的删除:

  • del 语句

如果要删除字典中的键值对,还是可以使用 del 语句,语法格式为:del dictname[key_obj],其中dictname 表示字典名称,key_obj 表示要删除的目标键值对的键名。

dict1 = {'语文': 85, '数学': 96, '英语': 92}
del dict1["语文"]
print(dict1)
# ==> {'数学': 96, '英语': 92}
  • pop 函数

pop 函数用来删除指定的键值对,语法格式为:dictname.pop(key_obj),其中,dictname 表示字典名,key_obj 表示字典中要删除的指定键值对的键名。

  • popitem 函数

popitem 函数用来删除字典中最后一个键值对,语法格式为:dictname.popitem(),其中,dictname 表示字典名。

dict1 = {'one': 100, 'two': 200, 'three': [100, 200, 300]}
dict1.pop("one")
print(dict1)
dict2 = {'one': 100, 'two': 200, 'three': [100, 200, 300]}
dict2.popitem()
print(dict2)
'''
{'two': 200, 'three': [100, 200, 300]}
{'one': 100, 'two': 200}
'''

2.7 判断字典中是否存在指定键值对

如果要判断字典中是否存在指定键值对,首先应判断字典中是否有对应的键。判断字典是否包含指定键值对的键,可以使用 in 或 not in 运算符,需要指出的是,对于 dict 而言,in 或 not in 运算符都是基于 key 来判断的,语法格式为:key_obj in dictname,其中,key_obj 表示要查找的目标键值对的键名,dictname 表示字典名,如果存在,返回 True,如果不存在,返回 False。

dict1 = {'语文': 85, '数学': 96, '英语': 92}
print("语文" in dict1)
print("物理" in dict1)
'''
True
False
'''

2.8 字典的遍历

  • 通过 for 循环遍历

for 循环有两种方法可以遍历字典中的键值对,语法格式为:

# 第一种方法
for key in dictname:print(key, dictname[key])
# 第二种方法
for key,value in dictname.items():print(key, value)

其中,dictname 表示字典名,key 表示列表中键值对对应的键,value 表示列表中键值对对应的值。

dict1 = {'语文': 85, '数学': 96, '英语': 92}
for key in dict1:print(key, dict1[key])
for key, value in dict1.items():print(key, value)
'''
语文 85
数学 96
英语 92
'''
  • 通过 keys 函数遍历

keys 函数用于返回字典中的所有键(key),语法格式为:dictname.keys()

  • 通过 values 函数遍历

values 函数用于返回字典中所有键对应的值(value),语法格式为:dictname.values()

  • 通过 items 函数遍历

items 函数用于返回字典中所有的键值对(key-value),语法格式为:dictname.items()

2.9 字典的复制(拷贝)

copy 函数返回一个字典的拷贝,也即返回一个具有相同键值对的新字典,语法格式为:dictname.copy()

a = {'one': 100, 'two': 200, 'three': [100, 200, 300]}
b = a.copy()
print(b)
# ==> {'one': 100, 'two': 200, 'three': [100, 200, 300]}

注意,copy 函数所遵循的拷贝原理,既有深拷贝,也有浅拷贝。拿拷贝字典 a 为例,copy 函数只会对最表层的键值对进行深拷贝,也就是说,它会再申请一块内存用来存放 {‘one’: 1, ‘two’: 2, ‘three’: []};而对于某些列表类型的值来说,此方法对其做的是浅拷贝,也就是说,b 中的 [100, 200, 300] 的值不是自己独有,而是和 a 共有。

a = {'one': 100, 'two': 200, 'three': [100, 200, 300]}
b = a.copy()
# 向 a 中添加新键值对,由于b已经提前将 a 所有键值对都深拷贝过来,因此 a 添加新键值对,不会影响 b。
a['four'] = 100
print(a)
print(b)
# 由于 b 和 a 共享[100,200,300](浅拷贝),因此移除 a 中列表中的元素,也会影响 b。
a['three'].remove(100)
print(a)
print(b)
'''
{'one': 100, 'two': 200, 'three': [100, 200, 300], 'four': 100}
{'one': 100, 'two': 200, 'three': [100, 200, 300]}
{'one': 100, 'two': 200, 'three': [200, 300], 'four': 100}
{'one': 100, 'two': 200, 'three': [200, 300]}
'''

2.10 字典的更新

update 函数可以使用一个字典所包含的键值对来更新己有的字典,在执行 update 函数时,如果被更新的字典中己包含对应的键值对,那么原 value 会被覆盖;如果被更新的字典中不包含对应的键值对,则该键值对被添加进去,语法格式为:dictname.update(dict_obj),其中,dict_obj 表示包含需要更新键值对的字典,dictname 表示需要被更新的字典。

dict1 = {'one': 100, 'two': 200, 'three': [100, 200, 300]}
dict2 = {'one': 100, 'two': 300, 'four': 400}
dict1.update(dict2)
print(dict1)
# ==> {'one': 100, 'two': 300, 'three': [100, 200, 300], 'four': 400}

相关文章:

3 python基本语法 - Dict 字典

Python 中字典&#xff08;dict&#xff09;是一种无序的、可变的序列&#xff0c;它的元素以“键值对&#xff08;key-value&#xff09;”的形式存储。相对地&#xff0c;列表&#xff08;list&#xff09;和元组&#xff08;tuple&#xff09;都是有序的序列&#xff0c;它们…...

Magnific AI:彻底改变 AI 生成图像的升级

在我最近与 Magnific AI 的讨论中&#xff0c;我不仅感到惊讶&#xff0c;而且对该工具提供的质量和可能性着迷。我发现 Magnific AI 能够转换人工智能生成的图像&#xff08;这些图像通常只能以低分辨率提供&#xff09;&#xff0c;尤其令人印象深刻&#xff0c;不仅在可打印…...

BKP 备份寄存器 RTC 实时时钟-stm32入门

这一章节我们要讲的主要内容是 RTC 实时时钟&#xff0c;对应手册&#xff0c;是第 16 章的位置。 实时时钟这个东西&#xff0c;本质上是一个定时器&#xff0c;但是这个定时器&#xff0c;是专门用来产生年月日时分秒&#xff0c;这种日期和时间信息的。所以学会了 STM32 的…...

1.1 数据结构-数据的表示

文章目录 1.1.1 二元关系及其性质:1.1.1.1 笛卡尔积:1.1.1.2 二元关系:持续更新当中 ....... 1.1.1 二元关系及其性质: 数据的基本单元称为额数据元素,数据是从客观事物的观测中的到的,数据元素并不是鼓励存在的,而是存在密切的联系,也因此才能表示和描述客观事物,数据元素之间…...

UNIX Linux系统 启动PPOCRLabel报错[已放弃 (核心已转储)]

参照官方教程安装后&#xff0c;启动PPOCRLabel报错&#xff1a;[已放弃 (核心已转储)] 官方链接地址&#xff1a;PPOCRLabelv2 $~ PPOCRLabel --lang ch QObject::moveToThread: Current thread (0x561534309430) is not the objects thread (0x56153929eac0). Cannot move to…...

前端开发中的webpack打包工具

前端技术发展迅猛&#xff0c;各种可以提高开发效率的新思想和框架层出不穷&#xff0c;但是它们都有一个共同点&#xff0c;即源代码无法直接运行&#xff0c;必须通过转换后才可以正常运行。webpack是目前主流的打包模块化JavaScript的工具之一。 本章主要涉及的知识点有&am…...

Mybatis配置-数据库厂商标识(databaseIdProvider)

MyBatis可以根据数据库供应商执行不同的语句。多数据库供应商支持是基于映射语句的databaseId属性。MyBatis将加载所有没有databaseId属性或具有与当前数据库匹配的databaseId属性的语句。如果找到具有和不具有databaseId的相同语句&#xff0c;则后者将被丢弃。要启用多供应商…...

【Java】使用递归的方法获取层级关系数据demo

使用递归来完善各种业务数据的层级关系的获取 引言&#xff1a;在Java开发中&#xff0c;我们通常会遇到层层递进的关系型数据的获取问题&#xff0c;有时是树状解构&#xff0c;或金字塔结构&#xff0c;怎么描述都行&#xff0c;错综复杂的关系在程序中还是可以理清的。 这…...

工业6轴机械臂运动学逆解(解析解)

工业6轴机械臂运动学逆解&#xff08;解析解&#xff09; 通常工业机械臂采用6旋转轴串连的形式&#xff0c;保证了灵活性&#xff0c;但为其运动学逆解&#xff08;即已知机械臂末端的位姿 P P P&#xff0c;求机械臂各个旋转轴的旋转角&#xff09;带来了较大的困难&#xff…...

管理类联考——数学——真题篇——按题型分类——充分性判断题——蒙猜A/B

老规矩&#xff0c;看目录&#xff0c;平均3-5题 文章目录 A/B2023真题&#xff08;2023-19&#xff09;-A-选项特点&#xff1a;两个等号&#xff1b;-判断需联立的难易&#xff1a;难&#xff0c;看着感觉需要联立&#xff0c;所以判断联立需要有理论支撑&#xff0c;不然还…...

为什么GRU和LSTM能够缓解梯度消失或梯度爆炸问题?

1、什么是梯度消失&#xff08;gradient vanishing&#xff09;&#xff1f; 参数更新过小&#xff0c;在每次更新时几乎不会移动&#xff0c;导致模型无法学习。 2、什么是梯度爆炸&#xff08;gradient exploding&#xff09;&#xff1f; 参数更新过小大&#xff0c;破坏了…...

【力扣100】146.LRU缓存

添加链接描述 class DLinkedNode:def __init__(self, key0, value0):self.key keyself.value valueself.prev Noneself.next Noneclass LRUCache:def __init__(self, capacity: int):self.cache dict()# 使用伪头部和伪尾部节点 self.head DLinkedNode()self.tail D…...

【Vue中给输入框加入js验证_blur失去焦点进行校验】

【Vue中给输入框加入js验证_blur失去焦点进行校验】 通俗一点就是给输入框加个光标离开当前文本输入框时&#xff0c;然后对当前文本框内容进行校验判断 具体如下&#xff1a; 1.先给文本框加属性 blur“validatePhoneNumber” <el-input v-model“entity.telephone” blur…...

vue3项目引入电子签名(可横屏竖屏)

实现效果&#xff1a;&#xff08;左边横屏&#xff0c;右边竖屏&#xff09; 前言&#xff1a;【使用开源项目smooth-signature 实现签名的功能。Gitee 地址是 &#xff1a;GitHub - linjc/smooth-signature: H5带笔锋手写签名&#xff0c;支持PC端和移动端&#xff0c;任何前…...

mysql中count(*)、count(1)、count(主键)、count(字段)的区别

文章目录 count函数的语义count(主键)count(1)count(*)count(字段)替代方案explain或者show table status中间表或者其他数据库计数 以下分析都是基于 select count(?) from table 这个语句来分析&#xff0c;不带过滤条件。 count函数的语义 count() 是一个聚合函数&#x…...

Nginx生成自签名证书从而添加域名的HTTPS访问

数字证书 ## 原理参考 https://mysticaldream.github.io/2023/05/certificate/## https://blog.csdn.net/m0_52440465/article/details/130713591 简介 数字证书是由证书颁发机构(CA)签名并颁发的电子文件,用于建立网络连接的身份认证和加密通信。SSL 证书是数字证书的一种。…...

无框架Java转go语言写http与tcp请求

项目地址 https://github.com/cmdch2017/http_tcpServer 项目结构 如何快速上手 http篇 1、controller包就相当于RestController&#xff0c;这里返回了一个Person对象&#xff0c;当你需要新建一个接口时&#xff0c;再新写一个func仿照下面的方法就行了 package control…...

【Git】Git基本操作

文章目录 Git 是什么Git 的优点Git 安装Linux UbuntuLinux CentOsWindows Git 基本操作1. 创建 Git 本地仓库2. 配置 Git3. Git工作区、暂存区和版本库4. 添加文件5. 查看 .git 文件6. 修改文件7. 版本回退 Git 是什么 Git是一个免费的、开源的分布式版本控制系统&#xff0c;…...

JavaSE学习笔记 Day20

JavaSE学习笔记 Day20 个人整理非商业用途&#xff0c;欢迎探讨与指正&#xff01;&#xff01; 上一篇 文章目录 JavaSE学习笔记 Day20十七、数据结构与算法17.1算法17.1.1冒泡排序17.1.2选择排序17.1.3插入排序17.1.4三个排序的区别 17.2顺序表17.2.1顺序表代码实现17.2.2顺…...

【蓝桥杯选拔赛真题52】python空调模式 第十四届青少年组蓝桥杯python 选拔赛比赛真题解析

目录 python空调模式 一、题目要求 1、编程实现 2、输入输出...

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...

Admin.Net中的消息通信SignalR解释

定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...

1688商品列表API与其他数据源的对接思路

将1688商品列表API与其他数据源对接时&#xff0c;需结合业务场景设计数据流转链路&#xff0c;重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点&#xff1a; 一、核心对接场景与目标 商品数据同步 场景&#xff1a;将1688商品信息…...

转转集团旗下首家二手多品类循环仓店“超级转转”开业

6月9日&#xff0c;国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解&#xff0c;“超级…...

C# SqlSugar:依赖注入与仓储模式实践

C# SqlSugar&#xff1a;依赖注入与仓储模式实践 在 C# 的应用开发中&#xff0c;数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护&#xff0c;许多开发者会选择成熟的 ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;SqlSugar 就是其中备受…...

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战

在现代战争中&#xff0c;电磁频谱已成为继陆、海、空、天之后的 “第五维战场”&#xff0c;雷达作为电磁频谱领域的关键装备&#xff0c;其干扰与抗干扰能力的较量&#xff0c;直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器&#xff0c;凭借数字射…...

大学生职业发展与就业创业指导教学评价

这里是引用 作为软工2203/2204班的学生&#xff0c;我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要&#xff0c;而您认真负责的教学态度&#xff0c;让课程的每一部分都充满了实用价值。 尤其让我…...

SQL慢可能是触发了ring buffer

简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...

Kafka入门-生产者

生产者 生产者发送流程&#xff1a; 延迟时间为0ms时&#xff0c;也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于&#xff1a;异步发送不需要等待结果&#xff0c;同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...

GitHub 趋势日报 (2025年06月06日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 590 cognee 551 onlook 399 project-based-learning 348 build-your-own-x 320 ne…...