坚持用 清晰易懂的图解 + 代码语言,让每个知识点变得简单!
🚀呆头个人主页详情
🌱 呆头个人Gitee代码仓库
📌 呆头详细专栏系列
座右铭: “不患无位,患所以立。”
在这里插入图片描述


Python学习之字典(一):基础操作与核心用法

  • 摘要
    • 一、字典是什么?
      • 1.字典的特性
      • 2.字典与其他数据结构的对比
    • 二、创建字典
      • 1.使用花括号创建
      • 2.使用dict()构造函数
      • 3.字典推导式
      • 4.fromkeys()方法
    • 三、查找键(Key)
      • 1.使用方括号访问
      • 2.使用get()方法
      • 3.使用in运算符检查键是否存在
    • 四、新增和修改元素
      • 1.添加新键值对
      • 2.修改现有键的值
      • 3.使用update()方法批量更新
      • 4.使用setdefault()方法
    • 五、删除元素
      • 1.使用del语句
      • 2.使用pop()方法
      • 3.使用popitem()方法
      • 4.使用clear()方法
    • 六、实际应用示例
      • 1.学生成绩管理系统
    • 七、总结与最佳实践
      • 1.字典使用的最佳实践
      • 2.常见陷阱与注意事项
    • 参考链接
    • 关键词标签

摘要

字典是Python中最强大的数据结构之一,它让我们能够用"键-值"的方式组织数据,实现高效查找和管理。本文将带你深入了解Python字典的基础知识和核心操作。

一、字典是什么?

字典(Dictionary)是Python中的一种内置数据类型,它是一个可变的、无序的键值对集合。与列表通过索引访问元素不同,字典通过键(key)来访问对应的值(value)。

1.字典的特性

字典的核心优势在于它的查找效率。由于采用了哈希表(Hash Table)的实现方式,字典可以在常数时间内完成查找操作,无论字典有多大。

2.字典与其他数据结构的对比

特性字典(dict)列表(list)元组(tuple)集合(set)
可变性
有序性⚠️(3.7+保持插入顺序)
索引访问
键值对
元素唯一性键唯一允许重复允许重复
查找效率O(1)O(n)O(n)O(1)

二、创建字典

Python提供了多种创建字典的方法,让我们一一了解。

1.使用花括号创建

最直接的方式是使用花括号 {} 并在其中列出键值对:

# 创建一个学生信息字典
student = {'name': '张三','age': 20,'major': '计算机科学','gpa': 3.8
}# 创建一个空字典
empty_dict = {}print(student)  # 输出完整字典
print(type(empty_dict))  # 输出: <class 'dict'>

这种方法直观明了,适合当你预先知道字典内容时使用。

2.使用dict()构造函数

dict() 构造函数提供了另一种创建字典的方式:

# 使用关键字参数创建字典
student = dict(name='李四', age=22, major='数学', gpa=3.9)# 从键值对序列创建
items = [('name', '王五'), ('age', 21), ('major', '物理')]
student2 = dict(items)print(student)   # {'name': '李四', 'age': 22, 'major': '数学', 'gpa': 3.9}
print(student2)  # {'name': '王五', 'age': 21, 'major': '物理'}

dict() 构造函数特别适合从其他数据结构转换或动态生成字典。

3.字典推导式

字典推导式(Dictionary Comprehension)是一种简洁创建字典的方法:

# 创建平方字典 {0:0, 1:1, 2:4, 3:9, 4:16}
squares = {x: x**2 for x in range(5)}# 创建字符及其ASCII码的字典
ascii_dict = {chr(i): i for i in range(97, 123)}  # a-z的ASCII码print(squares)    # {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}
print(ascii_dict) # {'a': 97, 'b': 98, ..., 'z': 122}

字典推导式在需要批量生成键值对时特别有用,代码简洁且易读。

4.fromkeys()方法

fromkeys() 方法用于创建一个新字典,以序列中的元素为键,以指定值为对应的值:

# 创建具有相同默认值的字典
keys = ['name', 'age', 'major', 'gpa']
student = dict.fromkeys(keys, None)# 创建具有默认值的课程成绩字典
courses = ['Math', 'Physics', 'Computer Science', 'English']
grades = dict.fromkeys(courses, 0)print(student)  # {'name': None, 'age': None, 'major': None, 'gpa': None}
print(grades)   # {'Math': 0, 'Physics': 0, 'Computer Science': 0, 'English': 0}

fromkeys() 方法在需要初始化多个键具有相同默认值的字典时非常有用。

三、查找键(Key)

字典的主要用途是通过键快速查找对应的值。Python提供了多种方法来实现这一功能。

1.使用方括号访问

最直接的方式是使用方括号 [] 和键名:

student = {'name': '张三','age': 20,'major': '计算机科学','gpa': 3.8
}# 访问字典中的值
print(student['name'])  # 输出: 张三
print(student['gpa'])   # 输出: 3.8# 如果键不存在,会引发KeyError
try:print(student['phone'])
except KeyError as e:print(f"错误: {e}")  # 输出: 错误: 'phone'

方括号访问方式简单直接,但如果键不存在会引发 KeyError 异常。

2.使用get()方法

get() 方法提供了一种更安全的访问方式,允许指定默认值:

student = {'name': '张三','age': 20,'major': '计算机科学'
}# 使用get()方法访问
name = student.get('name')  # 返回: '张三'
phone = student.get('phone')  # 键不存在,返回None
address = student.get('address', '未提供')  # 键不存在,返回默认值'未提供'print(name)     # 张三
print(phone)    # None
print(address)  # 未提供

get() 方法的优势在于它不会因为键不存在而引发异常,而是返回 None 或指定的默认值。

3.使用in运算符检查键是否存在

在访问键之前,可以先检查键是否存在:

student = {'name': '张三', 'age': 20, 'major': '计算机科学'}# 检查键是否存在
if 'name' in student:print(f"姓名: {student['name']}")if 'phone' not in student:print("电话信息不存在")# 根据键是否存在执行不同操作
gpa = student['gpa'] if 'gpa' in student else '未记录'
print(f"GPA: {gpa}")  # 输出: GPA: 未记录

使用 in 运算符可以避免因键不存在而引发的异常,使代码更加健壮。

四、新增和修改元素

字典是可变的数据结构,我们可以轻松地添加新的键值对或修改现有的值。

1.添加新键值对

向字典添加新键值对非常简单,只需使用赋值语句:

# 创建一个空字典
user = {}# 添加键值对
user['username'] = 'python_lover'
user['email'] = 'python@example.com'
user['active'] = True
user['login_count'] = 42print(user)
# 输出: {'username': 'python_lover', 'email': 'python@example.com', 'active': True, 'login_count': 42}

这种方式直观简单,是添加新键值对最常用的方法。

2.修改现有键的值

修改现有键的值与添加新键的语法相同:

student = {'name': '张三','age': 20,'major': '计算机科学','gpa': 3.5
}# 修改现有键的值
student['age'] = 21
student['gpa'] = 3.8print(student)
# 输出: {'name': '张三', 'age': 21, 'major': '计算机科学', 'gpa': 3.8}

如果键已存在,赋值操作会更新对应的值;如果键不存在,则会添加新的键值对。

3.使用update()方法批量更新

update() 方法允许我们使用另一个字典或键值对序列来更新当前字典:

student = {'name': '张三','age': 20,'major': '计算机科学'
}# 使用另一个字典更新
new_info = {'age': 21, 'gpa': 3.9, 'graduation_year': 2023}
student.update(new_info)print(student)
# 输出: {'name': '张三', 'age': 21, 'major': '计算机科学', 'gpa': 3.9, 'graduation_year': 2023}# 使用关键字参数更新
student.update(phone='123-456-7890', address='北京市海淀区')print(student)
# 输出包含新增的phone和address字段

update() 方法特别适合需要批量更新或合并字典的场景。

4.使用setdefault()方法

setdefault() 方法提供了一种特殊的更新方式,它只在键不存在时才设置值:

user = {'username': 'python_lover', 'email': 'python@example.com'}# 如果键不存在,则添加键值对
user.setdefault('active', True)  # 添加新键值对
user.setdefault('username', 'new_user')  # 键已存在,不会修改print(user)
# 输出: {'username': 'python_lover', 'email': 'python@example.com', 'active': True}

setdefault() 方法在需要为不存在的键设置默认值时特别有用。

用户代码Python字典添加/修改元素的不同方法dict['new_key'] = value直接赋值:如果键存在则更新值如果键不存在则添加新键值对dict.update({'key1': val1, 'key2': val2})批量更新:使用另一个字典中的键值对更新当前字典dict.setdefault('key', default_value)条件添加:只在键不存在时添加键值对dict |= {'key1': val1, 'key2': val2}合并运算符(Python 3.9+):类似update方法但语法更简洁用户代码Python字典

五、删除元素

Python提供了多种方法来删除字典中的元素,每种方法适用于不同的场景。

1.使用del语句

del 语句可以删除字典中的特定键值对:

student = {'name': '张三','age': 20,'major': '计算机科学','gpa': 3.8,'graduated': False
}# 删除特定键值对
del student['graduated']
print(student)  # 'graduated'键已被删除# 尝试删除不存在的键会引发KeyError
try:del student['phone']
except KeyError as e:print(f"错误: {e}")  # 输出: 错误: 'phone'

del 语句是最直接的删除方式,但如果键不存在会引发异常。

2.使用pop()方法

pop() 方法删除指定的键并返回对应的值:

student = {'name': '张三','age': 20,'major': '计算机科学','gpa': 3.8
}# 删除键并获取值
age = student.pop('age')
print(f"删除的年龄值: {age}")  # 输出: 删除的年龄值: 20
print(student)  # 'age'键已被删除# 删除可能不存在的键,提供默认值避免异常
phone = student.pop('phone', '未设置')
print(f"删除的电话值: {phone}")  # 输出: 删除的电话值: 未设置

pop() 方法的优势在于它既能删除键值对,又能返回被删除的值,并且可以指定默认值来处理键不存在的情况。

3.使用popitem()方法

popitem() 方法删除并返回字典中的一个键值对:

student = {'name': '张三','age': 20,'major': '计算机科学','gpa': 3.8
}# 删除并返回一个键值对
item = student.popitem()
print(f"删除的项: {item}")  # 在Python 3.7+中,删除最后插入的项
print(student)  # 字典少了一个键值对# 对空字典调用popitem()会引发KeyError
empty_dict = {}
try:empty_dict.popitem()
except KeyError as e:print(f"错误: {e}")  # 输出: 错误: 'popitem(): dictionary is empty'

在Python 3.7及以后的版本中,popitem() 方法会删除并返回最后插入的键值对,这使得它可以用作LIFO(后进先出)的数据结构。

4.使用clear()方法

clear() 方法删除字典中的所有键值对:

student = {'name': '张三','age': 20,'major': '计算机科学','gpa': 3.8
}# 清空字典
student.clear()
print(student)  # 输出: {}

clear() 方法在需要重用字典对象但清除其内容时特别有用。

40%30%15%10%5%字典删除操作使用频率del dict[key]dict.pop(key)dict.popitem()dict.clear()重新赋值新字典

六、实际应用示例

让我们通过一个实际的应用示例来巩固对字典的理解:

1.学生成绩管理系统

# 创建一个学生成绩管理系统
def create_grade_system():# 初始化空字典students = {}# 添加学生信息students['10001'] = {'name': '张三','courses': {'Math': 85,'Physics': 92,'Computer Science': 95}}students['10002'] = {'name': '李四','courses': {'Math': 78,'Physics': 85,'Chemistry': 90}}# 添加新学生students['10003'] = {'name': '王五', 'courses': {}}# 为王五添加课程成绩students['10003']['courses']['Math'] = 92students['10003']['courses']['English'] = 88return students# 计算学生的平均成绩
def calculate_average(student):courses = student['courses']if not courses:return 0total = sum(courses.values())return total / len(courses)# 查找成绩最高的课程
def find_best_course(student):courses = student['courses']if not courses:return Nonereturn max(courses.items(), key=lambda x: x[1])# 使用示例
students = create_grade_system()# 打印所有学生信息
for student_id, info in students.items():avg = calculate_average(info)best_course = find_best_course(info)print(f"学号: {student_id}, 姓名: {info['name']}")print(f"课程: {list(info['courses'].keys())}")print(f"平均成绩: {avg:.2f}")if best_course:print(f"最好的课程: {best_course[0]}, 成绩: {best_course[1]}")print("-" * 30)

这个例子展示了如何使用嵌套字典来构建一个简单的学生成绩管理系统,并实现了一些基本的统计功能。

STUDENTstringstudent_idstringnameCOURSEstringcourse_nameintgradetakes

七、总结与最佳实践

1.字典使用的最佳实践

  1. 选择合适的键:使用不可变类型作为键,优先考虑简单类型如字符串、数字或元组。
  2. 使用get()方法安全访问:当不确定键是否存在时,使用get()方法避免异常。
  3. 使用字典推导式:对于需要批量创建或转换的字典,考虑使用字典推导式提高代码可读性。
  4. 合理使用嵌套字典:对于复杂数据结构,可以使用嵌套字典,但注意不要嵌套过深,以免影响可读性。
  5. 定期清理不需要的键:对于长期运行的程序,定期清理不再需要的键值对,避免内存泄漏。

2.常见陷阱与注意事项

  1. 可变对象作为键:避免使用列表、字典等可变对象作为键,这会导致错误。
  2. 字典的浅拷贝:使用dict.copy()创建的是浅拷贝,嵌套的可变对象仍然是引用。
  3. 键的大小写敏感性:字典的键是大小写敏感的,'Name’和’name’是两个不同的键。
  4. 字典的内存开销:字典比列表占用更多的内存,对于大量简单数据,考虑使用其他数据结构。

📢 如果你也喜欢这种"不呆头"的技术风格:
👁️ 【关注】 看一个非典型程序员如何用野路子解决正经问题
👍 【点赞】 给"不写八股文"的技术分享一点鼓励
🔖 【收藏】 把这些"奇怪但有用"的代码技巧打包带走
💬 【评论】 来聊聊——你遇到过最"呆头"的 Bug 是啥?
🗳️ 【投票】 您的投票是支持我前行的动力
技术没有标准答案,让我们一起用最有趣的方式,写出最靠谱的代码! 🎮💻


参考链接

  1. Python官方文档 - 字典
  2. Python字典的实现原理
  3. Python 3.7中字典保持插入顺序的变化
  4. Python字典的性能优化
  5. Python数据结构性能比较

关键词标签

#Python #字典 #数据结构 #键值对 #哈希表

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[安洵杯 2019]Attack

BUUCTF在线评测BUUCTF 是一个 CTF 竞赛和训练平台&#xff0c;为各位 CTF 选手提供真实赛题在线复现等服务。https://buuoj.cn/challenges#[%E5%AE%89%E6%B4%B5%E6%9D%AF%202019]Attack流量分析题&#xff0c;浏览的时候发现攻击者上传信息页面&#xff0c; 直接搜索 flag 就…

复合机器人食品分拣生产线:一体化控制系统引领高效柔性新食代

在食品工业高速发展的今天&#xff0c;面对种类繁多、形态各异的原料分拣需求&#xff0c;以及日益严格的卫生安全与效率要求&#xff0c;传统的固定式分拣设备已难以胜任。复合机器人食品分拣生产线凭借其融合移动&#xff08;AMR&#xff09;与操作&#xff08;机械臂&#x…

二十七、动态SQL

动态SQL介绍动态SQL&#xff1a;if与where标签动态案例-动态更新EmpMapper&#xff08;接口&#xff09;中对应代码块 //动态更新员工public void update2(Emp emp);EmpMapper.xml中对应代码块 <!-- 动态更新员工--><update id"update2">update emp<s…

AI可行性分析:数据×算法×反馈=成功

3.1 从场景到AI可行性分析:需求拆解为“数据+算法+反馈” 核心公式: AI可行性 = 数据可获得性 算法适配性 反馈闭环性 (任一要素为0则需求不可行) 一、传统需求 vs AI需求本质差异 需求文档对比(电商案例) 维度 传统需求文档(购物车功能) AI需求文档(商品推荐系…

【图论】分层图 / 拆点

大多数都是同一个套路&#xff0c;将图拆开成几个图&#xff0c;每一层都对应着一个不同的状态&#xff0c;比如把到点 i 的状态拆成经过了 j 次操作所得的 xx 结果&#xff0c;一般数据不会很大 目前遇到的可分为 3 类&#xff1a; ①.给你最多 k 次操作&#xff0c;求 xx 结…

VS Code配置MinGW64编译MATIO库

VS Code 使用 MinGW64 编译 C 代码并配置 MATIO 库的完整步骤 1. 安装 MSYS2 下载 MSYS2 访问 MSYS2 官网下载安装包&#xff08;选择 x86_64 版本&#xff09;默认安装路径&#xff1a;C:\msys64 更新 MSYS2 包数据库 打开 MSYS2 MinGW 64-bit&#xff08;注意不是 MSYS&…

【前端Vue】使用ElementUI实现表单中可选择可编辑的下拉框

由于项目在vue的开发框架下&#xff0c;因此使用ElementUI组件库进行实现。我希望可选择可编辑的下拉框右侧有跟下拉框一样的箭头&#xff0c;并且在未输入任何内容时&#xff0c;点击该框体会出现选择列表进行填充数据的选择&#xff0c;点击选中数据后列表消失&#xff0c;数…

每日五个pyecharts可视化图表-line:从入门到精通 (4)

欢迎来到pyecharts折线图系列的第四篇文章&#xff01;在前三篇中&#xff0c;我们已经掌握了多种折线图类型&#xff0c;包括基本折线图、平滑折线图、雨量流量关系图、多X轴折线图、堆叠区域图和阶梯图等。在本文中&#xff0c;我们将继续探索五种更高级的折线图类型&#xf…

MySQL中的字符串函数

目录 一、字符串【分割】函数&#xff1a;SUBSTRING_INDEX() SUBSTRING_INDEX函数 练习题 统计每种性别的人数 提取博客URL中的用户名 截取出年龄 SQL83 商品id数据清洗统计 SQL250 查找字符串中逗号出现的次数 二、字符串【截取】函数&#xff1a;SUBSTRING() 基本语…

CodeBuddy IDE深度体验:AI驱动的全栈开发新时代

在人工智能技术迅猛发展的今天&#xff0c;开发者工具正在经历一场深刻的变革。腾讯推出的CodeBuddy IDE作为全球首个“产设研一体”的AI全栈高级工程师工具&#xff0c;重新定义了开发者的日常工作流程。 从需求分析到设计、编码、部署&#xff0c;CodeBuddy通过AI能力将传统…

实现Android图片手势缩放功能的完整自定义View方案,结合了多种手势交互功能

主要功能特点&#xff1a;支持双指手势缩放图片&#xff0c;通过ScaleGestureDetector实现平滑的缩放效果25双击图片可切换初始大小和中等放大比例16使用Matrix进行图像变换&#xff0c;保持缩放中心点为手势焦点位置57自动缩放动画通过Runnable实现渐进式变化1限制最小和最大缩…

uni-app实战教程 从0到1开发 画图软件 (橡皮擦)

一、本期内容简述1. 开发内容上一期&#xff0c;我们一起学习了如何进行绘画&#xff0c;本期我们将学习如何擦除我们所绘画的内容&#xff0c;也就是“橡皮擦”功能。首先&#xff0c;我们应该明确需求&#xff0c;橡皮擦可以擦除掉我们绘画的内容。2. 开发需求所以开发需求&a…

《A Practical Guide to Building Agents》文档学习

《A Practical Guide to Building Agents》文档总结 该文档是一份面向产品和工程团队的实用指南&#xff0c;旨在帮助团队探索并构建首个基于大语言模型&#xff08;LLM&#xff09;的智能体&#xff08;Agent&#xff09;&#xff0c;提炼了大量客户部署经验&#xff0c;提供了…

OpenCV图像注册模块

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 注册模块实现了参数化图像配准。所实现的方法是直接对齐&#xff08;direct alignment&#xff09;&#xff0c;即&#xff0c;它直接使用像素值来…

模型驱动与分布式建模:技术深度与实战落地指南

摘要 在AI、云原生与全球化协作的大潮中&#xff0c;模型驱动架构&#xff08;MDA&#xff09;与分布式建模不再是概念&#xff0c;而是支撑复杂系统设计与持续演化的核心引擎。本文从元模型、模型转换引擎&#xff0c;到协同协议、冲突解决算法&#xff0c;再到AI辅助建模与自…

计算机基础速通--数据结构·图的基础应用二(基础图算法)

如有问题大概率是我的理解比较片面&#xff0c;欢迎评论区或者私信指正。 最近了解到了一个新的改变和提高自己的方法时刻记录不论多小的事情都记下&#xff0c;我目前用了4天&#xff0c;之前感觉一天天忙死但没啥收获&#xff0c;但是记录了之后知道自己的时间花在了哪里&…

设计模式-策略模式 Java

模式概述 策略模式是一种行为型设计模式&#xff0c;它通过定义一系列可互换的算法&#xff0c;并将每个算法封装成独立类&#xff0c;使客户端能够根据需要动态切换算法 简单代码示例 // 1. 抽象策略接口 interface PaymentStrategy {void pay(int amount); }// 2. 具体策略实…

【机器学习深度学习】客观评估训练程度

目录 前言 一、什么是客观评估&#xff1f; 二、客观评估的两大核心方法 1. 判别式评测&#xff08;Discriminative Evaluation&#xff09; 2. 生成式评测&#xff08;Generative Evaluation&#xff09; 三、为什么客观评估成本更高&#xff1f; 1.训练目标收紧 2.训…

Linux软件编程:线程间通信

目录 一、线程间通信基础 1. 概念 2. 通信基础&#xff1a;共享空间 二、互斥锁&#xff08;Mutex&#xff09; 1. 概念 2. 使用流程 3. 函数接口 三、死锁 1. 概念 2. 死锁产生的 4 个必要条件 3. 避免死锁的方法 四、信号量&#xff08;Semaphore&#xff09; 1…

【学习笔记】JVM GC回收机制

1.三种基本的垃圾回收算法 1>标记-清除法 ①先将从树根开始&#xff0c;可以到达的对象标记为可达&#xff08;JVM中的对象们存储为一颗树&#xff09; ②将没有标记的对象清除掉 缺点&#xff1a;会产生大量内存碎片 2>复制算法&#xff08;新生代&#xff09; ①先将a区…