Python入门第6章:字典(键值对数据结构)

news2026/4/2 2:43:04
Python入门第6章字典键值对数据结构大家好欢迎来到Python入门系列的第6章内容在前5章里我们学会了变量、数据类型、运算符、if语句等基础知识点也接触了列表、元组这两种序列数据结构——它们都是通过“索引”来访问元素适合存储有序的、可重复的一组数据。但在实际编程中我们经常会遇到“通过一个标识快速找到对应数据”的场景比如通过姓名找成绩、通过ID找用户信息这时候列表和元组就显得不够高效了。今天我们要学习的字典dict就是为解决这种“映射关系”而生的核心数据结构。它像一本现实中的字典“拼音/部首”对应“键key”“汉字/解释”对应“值value”通过键可以快速定位到对应的值查询效率远超列表。这一章内容不难但使用频率极高是后续学习复杂程序、处理真实数据的基础咱们正式开始一、为什么需要字典先看一个场景假设我们要存储一个学生的信息包含姓名、年龄、性别、成绩。如果用之前学的列表会这样写student[张三,18,男,95]# 访问成绩需要记住索引3print(学生成绩,student[3])这种方式有两个明显的问题一是必须记住每个数据对应的索引一旦列表元素顺序调整所有索引访问都会出错二是如果数据量很大要找到某个信息需要逐个遍历列表效率很低。而用字典来存储就简洁又高效得多student{name:张三,age:18,gender:男,score:95}# 访问成绩直接用“键”查找无需记索引print(学生成绩,student[score])可以看到字典通过“键值对”的形式存储数据键是唯一的标识值是对应的数据通过键就能直接找到值这就是字典的核心优势——键值映射快速查找。二、字典的核心定义与特点字典是Python中一种**可变、键值对key-value**结构的数据类型Python 3.7版本后字典会保持插入时的顺序3.7之前为无序其核心特点的可以总结为4点必须牢记键key唯一同一个字典中键不能重复重复赋值会覆盖原来的值比如{“name”: “张三”, “name”: “李四”}最终name的值是“李四”。键不可变键必须是“不可变类型”比如字符串、数字、元组列表、字典等可变类型不能作为键否则会报错。值value可任意值可以是任意数据类型包括字符串、数字、列表、字典甚至元组也可以重复。字典可变可以动态添加、修改、删除字典中的键值对这一点和列表类似和元组不同。这里我们可以对比一下字典和之前学的列表、元组更清晰地理解它们的区别数据类型核心特点访问方式适用场景列表list有序、可变、元素可重复通过索引0开始存储有序的、可重复的一组数据元组tuple有序、不可变、元素可重复通过索引0开始存储不可修改的有序数据字典dict键值对、键唯一、可变3.7有序通过键key存储具有映射关系的数据如用户信息、配置参数三、字典的创建4种常用方式创建字典有多种方式其中最常用的是“大括号创建”其他方式根据场景灵活选择我们逐一讲解重点掌握前2种。1. 大括号 { } 创建最常用这是最简洁、最常用的创建方式语法格式{key1: value1, key2: value2, ..., keyn: valuen}键和值之间用冒号:连接多个键值对之间用逗号,分隔。# 1. 普通字典键为字符串值为不同类型student{name:张三,age:18,gender:男,score:95}print(student)# 输出{name: 张三, age: 18, gender: 男, score: 95}# 2. 值为列表/元组值可任意类型info{id:1001,hobbies:[篮球,游戏],is_student:True}print(info)# 输出{id: 1001, hobbies: [篮球, 游戏], is_student: True}# 3. 空字典用于后续动态添加数据empty_dict{}print(type(empty_dict))# 输出class dict2. dict() 函数创建推荐更规范使用内置函数dict()创建字典有两种常用写法适合批量创建或代码更规范的场景。# 写法1直接传入键值对参数键无需加引号student1dict(name李四,age19,gender女,score92)print(student1)# 输出{name: 李四, age: 19, gender: 女, score: 92}# 写法2传入可迭代对象如列表、元组每个元素是长度为2的键值对data[(name,王五),(age,20),(score,88)]student2dict(data)print(student2)# 输出{name: 王五, age: 20, score: 88}3. 字典推导式创建进阶简洁高效和列表推导式类似字典推导式可以快速生成字典适合根据已有数据批量生成键值对入门阶段了解即可后续会详细拓展。# 示例1生成“数字: 平方”的字典square_dict{i:i**2foriinrange(1,6)}print(square_dict)# 输出{1: 1, 2: 4, 3: 9, 4: 16, 5: 25}# 示例2筛选偶数对应的平方even_square{i:i**2foriinrange(1,10)ifi%20}print(even_square)# 输出{2: 4, 4: 16, 6: 36, 8: 64}4. fromkeys() 方法创建快速创建“同值”字典如果需要创建一个“多个键对应同一个值”的字典用fromkeys()方法非常高效语法dict.fromkeys(keys, value)value可选默认是None。# 生成键为(a, b, c)、值默认None的字典default_dictdict.fromkeys((a,b,c))print(default_dict)# 输出{a: None, b: None, c: None}# 生成键为1-3、值统一为0的字典zero_dictdict.fromkeys(range(1,4),0)print(zero_dict)# 输出{1: 0, 2: 0, 3: 0}四、字典的核心操作增删改查必掌握字典的核心操作围绕“键值对”展开即添加、修改、删除键值对以及查询值这部分是重点每个操作都要掌握搭配示例练习。1. 查获取字典中的值2种常用方式获取值是字典最常用的操作有两种方式重点区分它们的差异避免踩坑。student{name:张三,age:18,gender:男,score:95}# 方式1直接用 字典[键] 访问最常用但键不存在会报错print(student[name])# 输出张三# print(student[height]) # 报错KeyError: height键不存在# 方式2用 get() 方法访问推荐更安全键不存在返回默认值print(student.get(age))# 输出18# 键不存在时返回指定默认值此处默认值为未知print(student.get(height,未知))# 输出未知# 键不存在且未指定默认值返回Noneprint(student.get(height))# 输出None易错点提醒新手常因“键不存在”报错KeyError建议优先使用get()方法尤其是在不确定键是否存在的场景如处理用户输入、读取配置。补充如果想获取字典所有的键、所有的值、所有的键值对可以用这三个方法print(student.keys())# 获取所有键输出dict_keys([name, age, gender, score])print(student.values())# 获取所有值输出dict_values([张三, 18, 男, 95])print(student.items())# 获取所有键值对输出dict_items([(name, 张三), (age, 18), (gender, 男), (score, 95)])2. 增添加新的键值对2种方式字典是可变的可以随时添加新的键值对两种方式按需选择。student{name:张三,age:18,gender:男}# 方式1直接赋值最常用键不存在则新增student[score]95# 新增键值对score: 95print(student)# 输出{name: 张三, age: 18, gender: 男, score: 95}# 方式2用 update() 方法批量添加/合并字典# 批量添加多个键值对student.update({height:175,class:高一(1)班})print(student)# 输出包含新增的height和class键值对# 合并另一个字典other_info{hobby:篮球,address:北京}student.update(other_info)print(student)# 合并后包含other_info的所有键值对3. 改修改已有键值对修改的逻辑很简单键已存在时直接赋值就是修改和添加的方式一样区别在于键是否存在。student{name:张三,age:18,gender:男,score:95}# 键age已存在直接赋值修改student[age]19# 键score已存在修改分数student[score]98print(student)# 输出{name: 张三, age: 19, gender: 男, score: 98}注意字典的键是唯一的重复赋值会直接覆盖原有值不会报错这一点要注意避免误修改。4. 删删除字典中的键值对4种方式删除操作有4种常用方式分别对应不同的需求重点掌握前2种。student{name:张三,age:18,gender:男,score:95}# 方式1del 语句彻底删除无返回值键不存在会报错delstudent[gender]# 删除键为gender的键值对print(student)# 输出{name: 张三, age: 18, score: 95}# del student[height] # 报错KeyError: height# 方式2pop() 方法删除并返回对应的值推荐键不存在可指定默认值scorestudent.pop(score)# 删除score键返回对应的值95print(score)# 输出95print(student)# 输出{name: 张三, age: 18}# 键不存在时指定默认值避免报错heightstudent.pop(height,未知)print(height)# 输出未知# 方式3popitem() 方法删除最后一个键值对返回该键值对元组itemstudent.popitem()print(item)# 输出(age, 18)Python 3.7 按插入顺序删除最后一个print(student)# 输出{name: 张三}# 方式4clear() 方法清空字典保留字典对象仅删除所有键值对student.clear()print(student)# 输出{}五、字典的遍历重点常用场景遍历字典就是依次获取字典中的键、值或键值对常用的遍历方式有3种结合for循环使用覆盖大部分场景。student{name:张三,age:18,gender:男,score:95}# 方式1遍历字典的所有键默认遍历键最简洁forkeyinstudent:print(键,key,值,student[key])# 方式2遍历字典的所有键值对用items()方法最常用forkey,valueinstudent.items():print(f键{key}值{value})# 方式3单独遍历所有值用values()方法forvalueinstudent.values():print(值,value)运行结果方式2键name值张三 键age值18键gender值男 键score值95小贴士遍历字典时优先使用items()方法直接获取键和值代码更简洁如果只需要值再用values()方法避免冗余代码。六、字典的嵌套进阶高频使用当需要存储复杂数据比如多个学生的信息、用户的详细配置时我们可以在字典中嵌套字典、列表这就是字典的嵌套也是实际开发中非常常用的技巧。示例1字典嵌套字典存储多个学生信息# 字典嵌套key是学生IDvalue是每个学生的信息字典students{1001:{name:张三,age:18,score:95},1002:{name:李四,age:19,score:92},1003:{name:王五,age:20,score:88}}# 访问1002号学生的姓名print(students[1002][name])# 输出李四# 访问1003号学生的分数print(students[1003].get(score))# 输出88# 修改1001号学生的年龄students[1001][age]19print(students[1001])# 输出{name: 张三, age: 19, score: 95}示例2字典嵌套列表存储用户的爱好、联系方式等user{name:张三,age:18,hobbies:[篮球,游戏,编程],# 嵌套列表contact:{phone:13800138000,email:zhangsanexample.com}# 嵌套字典}# 访问用户的第一个爱好print(user[hobbies][0])# 输出篮球# 访问用户的邮箱print(user[contact][email])# 输出zhangsanexample.com# 给用户添加一个爱好user[hobbies].append(看书)print(user[hobbies])# 输出[篮球, 游戏, 编程, 看书]注意字典嵌套时访问元素要“逐层访问”比如要访问邮箱先找到contact键对应的字典再找email键不能直接写user[“email”]。七、常见易错点总结必看避坑关键入门阶段操作字典很容易踩坑结合全球开发者的高频错误统计总结5个最常见的错误帮大家避坑KeyError报错直接用字典[键]访问不存在的键导致报错。解决方法优先用get()方法或先判断键是否存在if 键 in 字典:。用可变类型作为键把列表、字典等可变类型当作键导致TypeError报错。记住键只能是字符串、数字、元组等不可变类型。重复键覆盖值无意之间重复定义同一个键后赋值的value会覆盖前值导致数据丢失。比如{name: 张三, name: 李四}最终name的值是“李四”。字典未初始化就赋值还没创建字典对象就直接给键赋值导致NameError报错。解决方法先通过{}或dict()初始化字典。嵌套字典访问错误访问嵌套字典时跳过中间层级直接访问内层键。比如user[email]正确写法是user[contact][email]。八、实战练习巩固知识点学完字典的核心操作动手练习才能真正掌握这里给大家3个练习题目从简单到复杂结合之前学的if语句巩固知识点简单创建一个字典存储自己的信息姓名、年龄、性别、爱好然后用get()方法获取自己的爱好若爱好不存在返回“无”。中等创建一个字典存储3个商品的信息商品名、价格、库存遍历字典打印出所有价格大于50的商品信息。进阶创建一个嵌套字典存储2个班级的信息班级名、班主任、3个学生的姓名和成绩然后修改其中一个学生的成绩并添加一个新的学生到对应班级。提示练习时可以结合if语句、for循环比如中等题中遍历商品时用if判断价格是否大于50再打印信息。练习答案会放在下一章开头哦~九、本章小结本章我们学会了Python中最常用的键值对数据结构——字典掌握了它的创建、增删改查、遍历、嵌套等核心操作也了解了字典的核心特点和常见易错点。核心要点回顾字典的核心是“键值映射”通过键快速查找值效率远高于列表适合存储有映射关系的数据。键的两个核心要求唯一、不可变值可以是任意类型可重复。核心操作查优先用get()、增直接赋值/updat()、改直接赋值、删del/pop()。字典嵌套是处理复杂数据的常用技巧访问时要逐层访问。字典是Python编程中不可或缺的工具后续学习函数、模块、数据处理时都会频繁用到它。下一章我们会学习循环语句for、while结合字典和if语句就能写出更复杂、更实用的程序啦如果大家在练习中遇到问题欢迎在评论区留言我会一一解答。我们下一章再见

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

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

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

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

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