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

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

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语句就能写出更复杂、更实用的程序啦如果大家在练习中遇到问题欢迎在评论区留言我会一一解答。我们下一章再见

相关文章:

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

Python入门第6章:字典(键值对数据结构) 大家好,欢迎来到Python入门系列的第6章内容!在前5章里,我们学会了变量、数据类型、运算符、if语句等基础知识点,也接触了列表、元组这两种序列数据结构—…...

油气勘探数据可视化流程图制作

一、前言 油气勘探属于高投入、高风险、数据密集型行业,勘探过程中会产生地震数据、测井数据、地质录井数据、试油试采数据等多维度海量信息。数据可视化流程图能够将复杂的勘探流程、数据流转逻辑、分析决策路径进行结构化呈现,既便于团队内部技术交底…...

千问3.5-9B提示词工程:优化OpenClaw任务拆解质量

千问3.5-9B提示词工程:优化OpenClaw任务拆解质量 1. 为什么需要优化提示词 去年冬天第一次用OpenClaw自动整理会议纪要时,我被它的"耿直"气笑了——让它"提取关键结论",结果给我返回了整段录音的文字版,连&…...

循环冷却水流量示意图设计 建筑水流量示意图绘制教程

一、引言 在建筑给排水、暖通空调及工业循环水系统设计中,循环冷却水流量示意图与建筑水流量示意图是核心技术图纸之一,其作用是直观呈现水流路径、管径规格、流量分配、设备连接关系及压力节点参数,为系统施工、调试、运维及故障排查提供可…...

[Python3高阶编程] - [Python3高阶编程] - 异步编程深度学习指南三:手动实现AsyncRLock

一、手动实现 AsyncRLockimport asyncio from typing import Optionalclass AsyncRLock:def __init__(self):self._lock asyncio.Lock() # 底层互斥锁self._owner: Optional[asyncio.Task] None # 当前持有锁的协程(Task)self._count 0 …...

OpenClaw安全加固指南:Phi-3-vision本地化部署的权限控制

OpenClaw安全加固指南:Phi-3-vision本地化部署的权限控制 1. 为什么需要安全加固? 上周我在调试一个自动处理发票的OpenClaw流程时,差点酿成大祸。这个流程需要读取财务部门的加密压缩包,解压后提取PDF发票进行OCR识别&#xff…...

LeetCode 热题100——128.最长连续序列

题目:给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。请你设计并实现时间复杂度为 O(n) 的算法解决此问题。示例 1:输入:nums [100,4,200,1,3,2] 输出&…...

记录模式 vs Lombok vs Record类,全维度性能与可维护性对比测试(含JMH压测数据)

第一章:Java记录模式的核心概念与演进背景Java记录模式(Record Patterns)是JDK 21中正式引入的预览特性(JEP 440),并在JDK 22中进一步增强(JEP 441),旨在为结构化数据解构…...

磁流变半主动悬架Simulink模型创建与策略设计详解

磁流变半主动悬架simulink模型,包含模型创建,模型策略设计磁流变悬架的Simulink建模就像搭积木——你得先搞清楚每块积木该放哪儿。咱们从最基础的四分之一车模型开始,车身质量、悬架刚度这些参数直接在Simulink里拖几个Mass和Spring模块就能…...

为什么你的Java车载服务在-40℃冷启动失败?温度敏感型ClassLoader加载异常的12小时紧急修复路径

第一章:为什么你的Java车载服务在-40℃冷启动失败?温度敏感型ClassLoader加载异常的12小时紧急修复路径低温环境并非仅影响硬件可靠性——JVM 的类加载机制在极端低温下会触发底层文件系统与内存映射的隐式行为偏移。某车规级 Java 服务在-40℃冷启动时反…...

Python原生AOT编译2026架构设计图(含C-API二进制兼容性矩阵+GC停顿压缩至≤80μs实证)

第一章:Python原生AOT编译2026架构全景概览Python原生AOT(Ahead-of-Time)编译在2026年已演进为一套融合语言语义、运行时契约与硬件感知能力的系统级基础设施。它不再依赖传统解释器或JIT中间态,而是通过静态类型推导、控制流图全…...

OpenClaw初学者套装:Qwen3.5-9B镜像+5个基础技能

OpenClaw初学者套装:Qwen3.5-9B镜像5个基础技能 1. 为什么选择这个组合? 上周六下午,我盯着电脑里散落各处的会议纪要、参考文章和代码片段,突然意识到自己每天要重复几十次"CtrlF→切换窗口→复制粘贴"的操作。作为一…...

STM32危化品管理系统设计与实现

1. 项目背景与需求分析实验室危化品管理一直是科研机构面临的重要挑战。传统的人工记录方式存在效率低下、容易出错、无法实时监控等问题,尤其对于易燃、易爆或有毒化学品的管理更是隐患重重。我曾参与过多个高校实验室的安全改造项目,亲眼见过因管理不善…...

JeecgBoot启动配置

一、引入maven指定自己的maven仓库 二、指定JDK 记得apply!!!!然后OK 三、配置MySQL数据库(尽量≥5.7版本) 四、运行db文件夹下的SQL文件 五、后端本地环境(application-dev.yml)指定好数据源 1、M…...

OpenClaw学习助手:Gemma-3-12b-it生成错题本与定制复习计划

OpenClaw学习助手:Gemma-3-12b-it生成错题本与定制复习计划 1. 为什么需要AI学习助手? 作为一名经常需要处理大量学习资料的开发者,我一直在寻找能够提升学习效率的工具。传统的错题本整理方式需要手动抄写题目、标注知识点、寻找同类练习题…...

2.Pandas在电商数据处理中的核心价值

第1章 Pandas在电商数据处理中应用 1.1 为什么Excel不够用,需要Pandas Pandas是Python里的数据分析核心库。它的名字来自“Panel Data”(面板数据),专门处理表格型数据。电商数据分析里,Pandas主要解决三类问题&#x…...

JAVA重点基础、进阶知识及易错点总结(15)缓冲流 + 转换流

🚀 Java 巩固进阶 第15天 主题:缓冲流 转换流 —— 高效 IO 与编码安全的终极方案📅 进度概览:今天学习 生产环境真正在用的流组合!掌握缓冲流 转换流,你的文件操作代码才能达到"标准、高效、不乱码…...

北海穷游必吃的美食哪家好

在北海,海鲜饮食是城市风味的底色。从侨港风情街到南湾夜市,从海鲜大排档到连锁餐饮店,消费者对海鲜的期待始终围绕着“鲜活”“原味”“实惠”三个关键词。近年来,随着游客结构的变化——年轻群体、学生党、自驾家庭及宠物出行者…...

JAVA重点基础、进阶知识及易错点总结(14)字节流 字符流

🚀 Java 巩固进阶 第14天 主题:字节流 & 字符流 —— 文件读写的核心引擎📅 进度概览:今天进入 IO 流的灵魂章节!掌握这 4 个核心类,你就能打通文件读写的任督二脉。 💡 核心价值&#xff…...

OpenClaw压力测试:Phi-3-mini-128k-instruct持续运行24小时稳定性报告

OpenClaw压力测试:Phi-3-mini-128k-instruct持续运行24小时稳定性报告 1. 测试背景与目标 上周在本地部署了OpenClawPhi-3-mini组合后,我一直在思考这套方案的稳定性边界。作为个人自动化助手,它能否胜任724小时不间断工作?当我…...

【Java低代码组件调试黄金法则】:20年架构师亲授5大高频故障定位技巧,90%开发者从未听说

第一章:Java低代码组件调试的本质与认知跃迁Java低代码平台并非屏蔽复杂性,而是将复杂性重新封装、可视化与可追溯化。调试低代码组件的本质,是穿透表层拖拽逻辑,定位其背后生成的Java字节码、Spring Bean生命周期行为、以及运行时…...

快速验证限流策略:用快马一键生成rate limit exceeded处理原型

快速验证限流策略:用快马一键生成rate limit exceeded处理原型 最近在开发一个需要调用第三方API的项目时,遇到了经典的"rate limit exceeded"问题。作为开发者我们都知道,API调用频率超限是系统设计中必须考虑的场景。传统从零搭…...

【限时开源】Polars 2.0清洗模板库V1.0发布:含金融时序对齐、电商ID映射、日志正则归一化等9大高复用Pipeline

第一章:Polars 2.0大规模数据清洗技巧入门到精通教程 Polars 2.0 是专为高性能、内存安全与并行计算设计的 DataFrame 库,其惰性执行引擎与零拷贝语义使其在处理 GB 级别结构化数据时显著优于 Pandas。本章聚焦真实场景下的数据清洗实践,涵盖…...

《B3845 [GESP样题 二级] 勾股数》

题目背景 对应的选择、判断题:https://ti.luogu.com.cn/problemset/1102 题目描述 勾股数是很有趣的数学概念。如果三个正整数 a,b,c,满足 a2b2c2,而且 1≤a≤b≤c,我们就将 a,b,c 组成的三元组 (a,b,c) 称为勾股数。你能通过编…...

气象数据可视化实战:从雷达图到三维风场,前端技术栈全解析

气象数据可视化实战:从雷达图到三维风场,前端技术栈全解析 气象数据的可视化一直是前端开发领域最具挑战性的方向之一。想象一下,当你需要将每小时更新的全球气象数据转化为直观的动态图像,让气象学家一眼就能看出台风路径、让飞行…...

构建企业级抓取服务:基于快马平台的openclaw生产环境部署实战

今天想和大家分享一个实战经验:如何用InsCode(快马)平台快速搭建企业级的openclaw分布式抓取服务。这个方案特别适合需要处理大规模数据采集的业务场景,比如电商价格监控、舆情分析或者竞品追踪。 分布式架构设计 生产环境最怕单点故障,所以我…...

学生信息管理系统--Python进阶项目

1.需求分析: ​需求:根据操作流程以及系统需求,完成面向对象版学生管理系统项目开发 ​a.可以显示基本的版本信息和操作界面; ​b.可以通过键盘输入信息来完成基本功能,例如选择序号、确认退出、添加学生、修改信息等; ​c.学生属性信息有姓名、性别、年…...

Mojo调用PyTorch模型推理却遭遇内存泄漏?——国家级实验室验证的4层内存隔离架构首次公开

第一章:Mojo调用PyTorch模型推理却遭遇内存泄漏?——国家级实验室验证的4层内存隔离架构首次公开在高性能AI边缘部署场景中,Mojo语言通过其零开销FFI机制调用PyTorch C前端(LibTorch)实现低延迟推理,但实测…...

告别‘空树’!用UIAutomation Client伪装无障碍工具,搞定新版微信自动化(附完整C#项目)

深度解析Windows UIAutomation在微信自动化中的高阶应用 微信作为国民级通讯工具,其PC端自动化一直是企业RPA和开发者关注的热点。随着微信4.1版本的更新,传统的UI自动化方案遭遇了重大挑战——UI树变得"空空如也"。这背后隐藏着怎样的技术原理…...

数字IC时序约束实战:深入解析clock_uncertainty的设置策略与后端影响

1. 时钟不确定度的本质与组成 刚入行数字IC设计时,我最头疼的就是时序约束里那些看似相似却又微妙差别的概念。记得第一次看到clock_uncertainty这个参数,我盯着综合报告里的红色违例发了半小时呆。后来才明白,这个参数就像给时钟信号加了&qu…...