本文目录导读:

我们来详细讲解一下如何在Python案例中使用字典(Dictionary),字典是Python中非常灵活、强大的内置数据结构,用于存储键值对(key-value pairs)。
我们先从基础概念开始,然后通过几个实际案例来演示它的用法。
什么是Python字典?
- 定义:字典用花括号 表示,内部包含一系列用逗号分隔的键值对。
- 键(Key):必须是唯一且不可变的数据类型(如字符串、数字、元组),它们是字典的“索引”。
- 值(Value):可以是任何数据类型(数字、字符串、列表、甚至另一个字典)。
- 特点:无序(Python 3.7+ 之后会保持插入顺序,但不应依赖顺序进行逻辑操作)、可变、查找速度快(基于哈希表)。
基本示例:
# 创建一个字典
student = {
"name": "Alice",
"age": 20,
"grades": [85, 92, 78],
"is_active": True
}
print(student["name"]) # 输出: Alice
print(student["grades"]) # 输出: [85, 92, 78]
字典的核心用法(增删改查)
1 访问值
- 直接通过键名:
dict_name[key]。- 如果键不存在,会引发
KeyError错误。
- 如果键不存在,会引发
get()方法(推荐):dict_name.get(key, default_value)。- 如果键不存在,返回
None或你指定的默认值,不会报错。
- 如果键不存在,返回
phone_book = {"Alice": "123", "Bob": "456"}
# 方式1:直接访问
print(phone_book["Alice"]) # 输出: 123
# print(phone_book["Charlie"]) # KeyError!
# 方式2:使用get() 安全访问
print(phone_book.get("Charlie")) # 输出: None
print(phone_book.get("Charlie", "未找到")) # 输出: 未找到
2 添加/修改键值对
- 添加:直接给一个新键赋值:
dict_name[new_key] = new_value。 - 修改:给一个已存在的键赋值:
dict_name[existing_key] = new_value。
inventory = {"apples": 10, "bananas": 5}
# 添加新商品
inventory["oranges"] = 8
print(inventory) # 输出: {'apples': 10, 'bananas': 5, 'oranges': 8}
# 修改现有商品数量
inventory["apples"] = 25
print(inventory) # 输出: {'apples': 25, 'bananas': 5, 'oranges': 8}
3 删除键值对
del dict_name[key]:删除指定键,如果键不存在,会引发KeyError。dict_name.pop(key, default):删除指定键并返回其值,如果键不存在,返回默认值(避免错误)。dict_name.clear():清空整个字典。
grades = {"Math": 90, "English": 85, "Science": 95}
# 使用 del 删除
del grades["English"]
print(grades) # 输出: {'Math': 90, 'Science': 95}
# 使用 pop 删除并获取值
removed_value = grades.pop("Math", "N/A")
print(f"删除的值是: {removed_value}") # 输出: 删除的值是: 90
print(grades) # 输出: {'Science': 95}
4 检查键是否存在
- 使用
in关键字:if key in dict_name:。
user_settings = {"theme": "dark", "language": "CN"}
if "theme" in user_settings:
print(f"当前主题是: {user_settings['theme']}")
else:
print("未设置主题")
实战案例:用字典解决实际问题
案例1:学生成绩管理系统(简单版)
场景:管理3个学生的各科成绩,并计算平均分。
students = {
"Alice": {"Math": 90, "English": 85, "Science": 92},
"Bob": {"Math": 78, "English": 80, "Science": 88},
"Charlie": {"Math": 95, "English": 91, "Science": 97}
}
# 1. 查询特定学生的成绩
def get_student_grade(name, subject):
if name in students:
return students[name].get(subject, "该科目不存在")
else:
return "学生不存在"
print(get_student_grade("Alice", "Math")) # 输出: 90
# 2. 计算所有学生的平均分
for student_name, grades in students.items():
total = sum(grades.values())
avg = total / len(grades)
print(f"{student_name} 的平均分是: {avg:.2f}")
# 输出:
# Alice 的平均分是: 89.00
# Bob 的平均分是: 82.00
# Charlie 的平均分是: 94.33
案例2:单词词频统计(案例分析)
场景:输入一段英文文本,统计每个单词出现的次数,这是字典最经典的应用之一。
text = "the quick brown fox jumps over the lazy dog the quick brown fox"
words = text.split() # 将字符串拆分成单词列表
word_count = {} # 创建一个空字典来存储词频
for word in words:
# 核心逻辑:如果单词在字典里,就+1;如果不在,就设置为1
if word in word_count:
word_count[word] += 1
else:
word_count[word] = 1
print(word_count)
# 输出: {'the': 3, 'quick': 2, 'brown': 2, 'fox': 2, 'jumps': 1, 'over': 1, 'lazy': 1, 'dog': 1}
# 更Pythonic的写法(使用get方法简化):
word_count2 = {}
for word in words:
word_count2[word] = word_count2.get(word, 0) + 1
print(word_count2) # 结果相同
案例3:JSON数据的读取与处理(真实应用)
场景:处理从API或配置文件返回的JSON数据(JSON结构天然对应Python的字典)。
import json
# 模拟从API获取的JSON字符串(通常API返回的就是字典)
user_data = '''
{
"user_id": 123,
"name": "John Doe",
"is_admin": false,
"preferences": {
"theme": "dark",
"notifications": true,
"language": "en"
},
"login_history": ["2023-01-01", "2023-06-15"]
}
'''
# 将JSON字符串解析为Python字典
user_dict = json.loads(user_data)
# 现在你可以像操作普通字典一样操作它
print(f"用户名: {user_dict['name']}")
print(f"主题偏好: {user_dict['preferences']['theme']}")
# 检查并修改值
if user_dict["is_admin"]:
print("该用户是管理员")
else:
print("普通用户")
# 修改偏好
user_dict["preferences"]["language"] = "CN"
print(json.dumps(user_dict, indent=2)) # 把字典转回JSON字符串,带缩进
案例4:使用字典作为函数参数(**kwargs)
场景:当函数需要接收不确定数量的关键字参数时,可以使用 **kwargs。
def create_profile(name, **kwargs):
"""
创建一个用户配置文件。
除了必须的 name,其他属性通过字典参数传递。
"""
profile = {
"name": name,
"age": kwargs.get("age", "未知"),
"city": kwargs.get("city", "未知"),
"job": kwargs.get("job", "无")
}
return profile
# 调用函数时,可以传入任意关键字参数
user1 = create_profile("Alice")
print(user1) # 输出: {'name': 'Alice', 'age': '未知', 'city': '未知', 'job': '无'}
user2 = create_profile("Bob", age=30, city="Beijing", job="Engineer")
print(user2) # 输出: {'name': 'Bob', 'age': 30, 'city': 'Beijing', 'job': 'Engineer'}
字典的常用方法总结
| 方法 | 说明 | 示例 |
|---|---|---|
dict.keys() |
返回所有键的视图 | phone_book.keys() |
dict.values() |
返回所有值的视图 | phone_book.values() |
dict.items() |
返回所有键值对的视图(元组) | for k, v in dict.items(): |
dict.get(k, d) |
安全获取值 | value = d.get('x', 0) |
dict.pop(k, d) |
删除并返回值 | removed = d.pop('x', None) |
dict.update(d2) |
合并另一个字典 | d1.update(d2) |
dict.setdefault(k, d) |
如果键不存在,插入并返回d | value = d.setdefault('x', []) |
del dict[k] |
删除键 | del d['x'] |
k in dict |
检查键是否存在 | if 'x' in d: |
易错点 & 最佳实践
-
键必须是不可变类型:列表、字典不能作为键,元组可以(如果包含不可变元素)。
-
避免使用
dict作为变量名:这会覆盖内置类型dict()。 -
优先用
get()而不是in+ 组合:get()更简洁、原子化。 -
遍历时不要修改字典大小:如果在循环中需要删除元素,可以创建一个要删除的键的列表,循环结束后再删除。
# 错误示范 # for k in d: # if condition(k): # del d[k] # 会报错或跳过元素 # 正确做法 keys_to_delete = [k for k in d if condition(k)] for k in keys_to_delete: del d[k]
字典是Python中处理结构化的、有标签的数据的首选工具,从配置管理到数据处理,再到构建复杂对象,理解并熟练使用字典是掌握Python的关键一步,希望这些案例对你有帮助!