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

从零开始的python学习——字典

ʕ • ᴥ • ʔ

づ♡ど

 🎉 欢迎点赞支持🎉

个人主页:励志不掉头发的内向程序员;

专栏主页:python学习专栏;


文章目录

前言

一、字典是什么

二、创建字典

三、查找 key

四、新增/修改元素

五、删除元素

六、遍历字典元素

七、取出所有 key 和 value

八、合法的 key 类型

总结


前言

字典也是 Python 中一个比较常用的一个内置类型,我们本章节就来简单讲讲它的使用方法已经它的增删查改。我们一起来往下看。


一、字典是什么

字典是一种存储键值对的结构。

键值对是计算机/生活中一个非常广泛使用的概念,把键(key)和值(value)进行一个一对一的映射,然后就可以根据键,快速找到值。

就好像我们上学时期,学校会给我们不同的学生分配唯一的学号,此时知道了学号,就能确定这个学生了。而这里的 “学号” 就是 “键”,“学生” 就是 “值”。

在 Python 的字典中,可以同时包含很多个键值对,同时要求这些键,不能重复。

二、创建字典

创建一个空的字典,使用 { } 表示字典,也可以使用 Python 中的关键字 dict 来创建。

# 创建字典
a = {}
print(type(a))
b = dict()
print(type(b))

也可以在创建的同时指定初始值。

键值对之间使用 , 分割、键和值之间使用 : 分割(冒号后面推荐加一个空格)。

使用 print 来打印字典内容。

# 创建字典的同时设置初始值
a = {'id' : 1, 'name' : 'zhangsan'}
print(a)

在此字典中,写了两个键值对:

第一个键值对是 'id' : 1,key 就是 'id',value 就是 1。

第二个键值对是 'name' : 'zhangsan',key 就是 'name',value 就是 'zhangsan'。

一个字典中的 key 的类型不一定都一样,一个字典中 value 的类型也不必都一样。但是字典对应 key 的类型是有约束的(不是什么类型都可以是 key),对 value 类型却没有啥约束。

我们上面的字典只有两个键值对还好,但是如果键值对多了,那我们这种写法就会有很长的一行,不够直观,所以这里建议一个键值对就写一行,以下的写法就比较直观了。

a = {'id' : 1,'name' : 'zhangsan'
}
print(a)

三、查找 key

使用 in 可以判定 key 是否在字典中存在,返回布尔值。

# 使用 in 来判定某个 key 是否在字典中存在
a = {'id' : 1,'name' : 'zhangsan'
}print('id' in a)
print('classId' in a)

查看 'id' 和 'classId' 是否在字典 a 中,在就返回 True,不在就返回 False。

我们的 in 操作只是判断 key 是否在字典中,和 value 无关。

#in 只是判定 key 是否存在,和 value 无关
print('zhangsan' in a)

由于 'zhangsan' 是 value 而非 key,所以在判定中仍然是 False 而非 True。

当然,我们除了 in,还有一个 not in 是来判定 key 在字典中不存在,与 in 相反。

# 使用 not in 来判定某个 key 是否在字典中不存在
a = {'id' : 1,'name' : 'zhangsan'
}print('id' not in a)
print('classId' not in a)

使用 [ ] 通过类似于取下标的方式,获取到元素的值,只不过此处的 "下标" 是 key(可能是整数,也可能是字符串等其他类型)。

# 使用 [ ] 来根据 key 获取到 value
a = {'id' : 1,'name' : 'zhangsan'
}print(a['id'])
print(a['name'])

当然,我们 [ ] 中填入的是 key,具体是上面类型就看 key 是什么类型的,不是一定就只能填字符串。

# 使用 [ ] 来根据 key 获取到 value
a = {100 : 'lisi'
}print(a[100])

如果 key 在字典中不存在,则会抛出异常。

a = {100 : 'lisi'
}print(a['classId'])

这个错误信息就表示我们的 key 不存在。

对于字典来说,使用 in 或者 [ ] 来获取 value,都是非常高效的操作。

对于列表/元组来说,使用 in 是比较低效的,而使用 [ ] 是比较高效的操作。

主要是因为字典背后使用了特殊的数据结构:哈希表。这个数据结构特别擅长查找。而我们列表背后是类似于顺序表,这个数据结构擅长插入数据而非查找数据。

四、新增/修改元素

使用 [ ] 可以根据 key 来新增/修改 value。

如果 key 不存在,对取下标操作赋值,即为新增键值对。

# 在字典中新增元素,使用 [ ] 来进行
a = {'id' : 1,'name' : 'zhangsan'
}# 这个操作就是往字典里插入新的键值对
a['score'] = 90
print(a)

我们如果把这个 key 值输出出来肯定就会报错,因为它不存在,但是这里是插入操作,所以就没有问题了。

如果 key 已经存在,对取下标操作赋值,即为修改键值对的值。

# 在字典中,根据 key 修改 value,也是使用 [ ] 来进行
a['score'] = 100
print(a)

我们可以发现,'score' 值对应的 90 修改成了 100。

这里就和前面的变量创建是类似的:

a = 10     # a 当前不存在,这里就是定义变量(创建新变量)

a = 20     # a 当前已经存在了,这里就是修改变量

五、删除元素

使用 pop 方法根据 key 删除对应的键值对。

# 使用 pop 方法,根据 key 来删除键值对
a = {'id' : 1,'name' : 'zhangsan'
}a.pop('name')
print(a)

此时打印就不再包含 'name' 的键值对了。

其实,字典的各种操作,都是针对 key 来进行的。新增、删除、获取 value、修改 value......,都是如此。

六、遍历字典元素

直接使用 for 循环能够获取到字典中所有的 key,进一步的就可以取出每个值了。

# 直接使用 for 循环来遍历字典
a = {'id' : 1,'name' : 'zhangsan','score' : 90
}for key in a:print(key, a[key])

for 循环只能拿到 key 值,不能拿到 value,我们想要输出 value 还得使用 [ ]。

我们可以发现,我们遍历打印的顺序和我们定义的顺序是一样的。大家如果学过 C++/Java 就应该知道,我们哈希表里面的键值对存储顺序是无序的。所有我们插入元素的顺序,不代表我们打印的顺序。但是在 Python 中做了特殊处理,能够保证遍历出来的顺序,就是和插入的顺序是一样的。

七、取出所有 key 和 value

使用 keys 方法可以获取到字典中的所有的 key。

a = {'id' : 1,'name' : 'zhangsan','score' : 90
}print(a.keys())

返回的结果看上去像列表,但是又不完全是。它是一个自定义类型,但是使用的时候也可以把它当作一个列表来使用。

使用 values 方法可以获取到字典中的所有 value

a = {'id' : 1,'name' : 'zhangsan','score' : 90
}print(a.values())

和 keys是类似的,返回的结果看上去也像列表把 value 包含进去的。

使用 items 方法可以获取到字典中所有的键值对。

a = {'id' : 1,'name' : 'zhangsan','score' : 90
}print(a.items())

这就就像一个列表一样的结构,里面存储了很多个元组,元组里面包含了键和值。

此时我们就可以通过多元赋值的操作改进 for 循环。

a = {'id' : 1,'name' : 'zhangsan','score' : 90
}for key, value in a.items():print(key, value)

八、合法的 key 类型

不是所有的类型都可以作为字典的 key。

字典本质上是一个哈希表,哈希表的 key 要求是 "可哈希的",也就是可以计算出的哈希值。

可以使用 hash 函数计算某个对象的哈希值,hash 函数是 Python 的内置函数,可以直接使用。

#使用 hash 函数能够计算出一个变量的哈希值
print(hash(0))
print(hash(3.14))
print(hash('hello'))
print(hash(True))
print(hash((1, 2, 3)))

但凡能够计算出哈希值的类型,都可以作为字典的 key。

以上的类型都可以计算哈希值,但是有的类型就无法计算,我们hash去计算它们的时候会直接报错。

列表无法计算哈希值

# 有的类型是不能计算哈希值的
print(hash([1, 2, 3]))

此时错误信息就是列表不可哈希。

字典也无法计算哈希值

# 有的类型是不能计算哈希值的
print(hash({ }))

所以说像上面的整型、浮点型、字符串等可哈希的类型就可以作为字典的 key 使用,像下面的列表、字典等不可哈希的就不能作为字典的 key 使用。

不可变的对象,一般就是可哈希的。而可变的对象,一般就是不可哈希的。我们的整型等,可以明确的用一种规范的方式算出我们的哈希值,但是我们列表等,随时都可以插入和删除,没办法用一种规范的方式算出我们的哈希值。


总结

字典类型也是属于 Python 中比较常用的类型,关于它的操作,我们已经介绍了不少了,但是其实这些只是这些操作中最基础的增删查改,如果想要学习更加复杂的操作,我们可以去查看 Python 的官方文档,或者等博主后面再慢慢更新。

 

🎇坚持到这里已经很厉害啦,辛苦啦🎇

ʕ • ᴥ • ʔ

づ♡ど

http://www.xdnf.cn/news/20184.html

相关文章:

  • 永磁同步电机负载估计算法--非线性扩张状态观测器
  • 看见世界的另一种可能:Deepoc星眸(StarGaze)如何为视障生活带来曙光
  • Onlyoffice集成与AI交互操作指引(Iframe版)
  • 美团发布 | LongCat-Flash最全解读,硬刚GPT-4.1、Kimi!
  • 标签系统的架构设计与实现
  • Oracle软件在主机平台的应用(课程下载)
  • 请求超过Spring线程池的最大线程(处理逻辑)
  • 企业级项目管理方法设计指南
  • Scikit-learn Python机器学习 - 特征预处理 - 标准化 (Standardization):StandardScaler
  • 音视频面试题集锦第 38 期
  • 电影级文字生视频核心代码手册
  • CASToR 生成的文件进行转换
  • 1.数据库介绍
  • java面试:有了解过数据库事务吗,能详细讲一讲么
  • 四川地区燃气从业人员考试题库及答案
  • Redis中的hash数据类型
  • 在LangChain中无缝接入MCP服务器扩展AI智能体能力
  • 从零开始的云计算生活——第五十九天,基于Jenkins自动打包并部署Tomcat环境
  • 浅析多模态标注对大模型应用落地的重要性与标注实例
  • 图像的几种成像方式简介
  • rust语言 (1.88) egui (0.32.1) 学习笔记(逐行注释)(二十六)windows平台运行时隐藏控制台
  • 手把手教你用Go打造带可视化的网络爬虫
  • Day36 IO多路复用技术
  • Docker Desktop 安装 wsl问题
  • android 四大组件—Activity源码详解
  • 沪深300股指期权包含上证50期权吗?
  • Chatwith:定制你的AI 聊天机器人
  • 如何从chrome中获取会话id
  • 三坐标测量机在汽车制造行业中的应用
  • 用得更顺手的 Protobuf 文件后缀、流式多消息、大数据集与“自描述消息”实战