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语句就能写出更复杂、更实用的程序啦如果大家在练习中遇到问题欢迎在评论区留言我会一一解答。我们下一章再见
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2473951.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!