Python案例如何使用字典?

wen python案例 13

本文目录导读:

Python案例如何使用字典?

  1. 什么是Python字典?
  2. 字典的核心用法(增删改查)
  3. 实战案例:用字典解决实际问题
  4. 字典的常用方法总结
  5. 易错点 & 最佳实践

我们来详细讲解一下如何在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:

易错点 & 最佳实践

  1. 键必须是不可变类型:列表、字典不能作为键,元组可以(如果包含不可变元素)。

  2. 避免使用 dict 作为变量名:这会覆盖内置类型 dict()

  3. 优先用 get() 而不是 in + 组合get() 更简洁、原子化。

  4. 遍历时不要修改字典大小:如果在循环中需要删除元素,可以创建一个要删除的键的列表,循环结束后再删除。

    # 错误示范
    # 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的关键一步,希望这些案例对你有帮助!

抱歉,评论功能暂时关闭!