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

坚持用 清晰易懂的图解 + 代码语言,让每个知识点变得简单!

🚀呆头个人主页详情

🌱 呆头个人Gitee代码仓库

📌 呆头详细专栏系列

座右铭: "不患无位,患所以立。"


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

摘要

字典是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.使用花括号创建

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

python 复制代码
# 创建一个学生信息字典
student = {
    'name': '张三',
    'age': 20,
    'major': '计算机科学',
    'gpa': 3.8
}

# 创建一个空字典
empty_dict = {}

print(student)  # 输出完整字典
print(type(empty_dict))  # 输出: <class 'dict'>

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

2.使用dict()构造函数

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

python 复制代码
# 使用关键字参数创建字典
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)是一种简洁创建字典的方法:

python 复制代码
# 创建平方字典 {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() 方法用于创建一个新字典,以序列中的元素为键,以指定值为对应的值:

python 复制代码
# 创建具有相同默认值的字典
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.使用方括号访问

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

python 复制代码
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() 方法提供了一种更安全的访问方式,允许指定默认值:

python 复制代码
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运算符检查键是否存在

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

python 复制代码
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.添加新键值对

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

python 复制代码
# 创建一个空字典
user = {}

# 添加键值对
user['username'] = 'python_lover'
user['email'] = 'python@example.com'
user['active'] = True
user['login_count'] = 42

print(user)
# 输出: {'username': 'python_lover', 'email': 'python@example.com', 'active': True, 'login_count': 42}

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

2.修改现有键的值

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

python 复制代码
student = {
    'name': '张三',
    'age': 20,
    'major': '计算机科学',
    'gpa': 3.5
}

# 修改现有键的值
student['age'] = 21
student['gpa'] = 3.8

print(student)
# 输出: {'name': '张三', 'age': 21, 'major': '计算机科学', 'gpa': 3.8}

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

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

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

python 复制代码
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() 方法提供了一种特殊的更新方式,它只在键不存在时才设置值:

python 复制代码
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 语句可以删除字典中的特定键值对:

python 复制代码
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() 方法删除指定的键并返回对应的值:

python 复制代码
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() 方法删除并返回字典中的一个键值对:

python 复制代码
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() 方法删除字典中的所有键值对:

python 复制代码
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.学生成绩管理系统

python 复制代码
# 创建一个学生成绩管理系统
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'] = 92
    students['10003']['courses']['English'] = 88
    
    return students

# 计算学生的平均成绩
def calculate_average(student):
    courses = student['courses']
    if not courses:
        return 0
    total = sum(courses.values())
    return total / len(courses)

# 查找成绩最高的课程
def find_best_course(student):
    courses = student['courses']
    if not courses:
        return None
    return 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)

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

七、总结与最佳实践

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 #字典 #数据结构 #键值对 #哈希表

相关推荐
鱼鱼说测试3 分钟前
Jenkins+Python自动化持续集成详细教程
开发语言·servlet·php
AntBlack14 分钟前
不当韭菜V1.1 :增强能力 ,辅助构建自己的交易规则
后端·python·pyqt
艾莉丝努力练剑33 分钟前
【洛谷刷题】用C语言和C++做一些入门题,练习洛谷IDE模式:分支机构(一)
c语言·开发语言·数据结构·c++·学习·算法
CHEN5_021 小时前
【Java基础面试题】Java基础概念
java·开发语言
武昌库里写JAVA2 小时前
JAVA面试汇总(四)JVM(一)
java·vue.js·spring boot·sql·学习
小幽余生不加糖2 小时前
电路方案分析(二十二)适用于音频应用的25-50W反激电源方案
人工智能·笔记·学习·音视频
落霞的思绪3 小时前
Java设计模式详细解读
java·开发语言·设计模式
阿巴~阿巴~3 小时前
深入解析C++ STL链表(List)模拟实现
开发语言·c++·链表·stl·list
..过云雨3 小时前
01.【数据结构-C语言】数据结构概念&算法效率(时间复杂度和空间复杂度)
c语言·数据结构·笔记·学习