Python3 字典(长文讲解)

更新时间:

💡一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

  • 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...点击查看项目介绍 ;
  • 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;

截止目前, 星球 内专栏累计输出 82w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2900+ 小伙伴加入学习 ,欢迎点击围观

一、前言

Python3 字典(Dictionary)是编程中最具灵活性的数据结构之一。它以“键值对”的形式存储数据,广泛应用于数据管理、配置解析、缓存系统等场景。无论是编程初学者还是中级开发者,掌握字典的使用技巧都能显著提升代码效率。本文将从基础概念、核心操作、高级特性到实际案例,逐步展开对 Python3 字典的深度解析,帮助读者建立清晰的认知框架。


二、字典的核心概念与基本操作

1. 什么是字典?

字典是一种无序的、可变的、键值对集合,其核心特性是通过键(Key)快速查找对应的值(Value)。可以将字典想象成一个图书馆的目录系统

  • 键(Key):如同书名或索引号,唯一标识一个条目。
  • 值(Value):对应书籍的具体位置或详细信息。

通过键值对的设计,字典实现了高效的数据检索,其时间复杂度接近 O(1),远超列表的线性查找(O(n))。

示例:创建字典

empty_dict = {}  

student_info = {  
    "name": "Alice",  
    "age": 20,  
    "major": "Computer Science"  
}  

scores = dict(math=90, english=85)  

2. 字典的键规则

  • 键必须是不可变类型:常见的键类型包括字符串、数字、元组(但元组内部元素也需不可变)。
  • 键的唯一性:若重复添加相同键,后一个值会覆盖前一个。
  • 值可以是任意类型:支持字符串、数字、列表、甚至其他字典。

示例:键的限制与灵活性

valid_keys = {  
    (1, 2): "tuple key",  # 元组作为键  
    3.14: ["list value"], # 值为列表  
    "nested_dict": {      # 值为嵌套字典  
        "key": "value"  
    }  
}  

invalid_dict = {[1,2]: "invalid"}  # 抛出 TypeError  

三、字典的常用操作

1. 访问与修改元素

通过方括号语法get()方法访问值,通过直接赋值修改键值对。

示例:访问与修改

print(student_info["name"])  # 输出 "Alice"  

student_info["age"] = 21  

student_info["gpa"] = 3.8  

注意

  • 如果用 [] 访问不存在的键,会抛出 KeyError
  • get() 方法提供更安全的访问方式,默认返回 None 或自定义值:
print(student_info.get("gpa", "N/A"))  # 输出 3.8  
print(student_info.get("address"))     # 输出 None  

2. 遍历字典

可以通过键、值或键值对进行遍历,常用的方法包括 keys()values()items()

示例:遍历技巧

for key in student_info.keys():  
    print(key)  

for value in student_info.values():  
    print(value)  

for key, value in student_info.items():  
    print(f"{key}: {value}")  

3. 字典的增删改查(CRUD)

  • 增加:直接赋值或使用 update() 方法。
  • 删除:用 delpop() 方法。
  • 检查存在性:通过 in 关键字或 get()

示例:综合操作

student_info.update({"email": "alice@example.com"})  

del student_info["gpa"]  
popped_value = student_info.pop("major")  # 返回被删除的值  

if "email" in student_info:  
    print("Email exists!")  

四、字典的高级特性

1. 字典推导式(Dictionary Comprehension)

通过简洁的语法快速生成字典,尤其适合从其他数据结构(如列表、元组)转换。

示例:从列表生成字典

numbers = [10, 20, 30]  
number_dict = {num: idx for idx, num in enumerate(numbers)}  

even_numbers = {x: x**2 for x in numbers if x % 2 == 0}  

2. 字典的默认值操作

使用 get()setdefault()defaultdict(需导入自 collections)来避免 KeyError

示例:setdefault()defaultdict

student_info.setdefault("hobby", []).append("reading")  

from collections import defaultdict  
default_dict = defaultdict(list)  
default_dict["fruits"].append("apple")  

3. 字典的排序与合并

  • 排序:通过 sorted() 函数结合 items() 对键或值排序。
  • 合并字典:Python3.9+ 支持 | 运算符,旧版本可用 update() 或字典解包。

示例:排序与合并

sorted_items = sorted(student_info.items(), key=lambda x: x[0])  

merged_dict = student_info | scores  

merged_dict = {**student_info, **scores}  

五、实战案例:电商库存管理系统

案例背景

假设我们需管理一家电商的库存,记录商品名称、价格、库存数量和销售记录。

1. 数据结构设计

inventory = {  
    "product1": {  
        "name": "Laptop",  
        "price": 1200,  
        "stock": 50,  
        "sales": []  
    },  
    "product2": {  
        "name": "Smartphone",  
        "price": 800,  
        "stock": 100,  
        "sales": []  
    }  
}  

2. 核心功能实现

  • 添加销售记录
def record_sale(product_id, quantity):  
    if product_id in inventory:  
        product = inventory[product_id]  
        if product["stock"] >= quantity:  
            product["stock"] -= quantity  
            product["sales"].append(quantity)  
            return True  
        else:  
            print("库存不足!")  
    else:  
        print("商品不存在!")  
  • 计算总销售额
def calculate_total_sales(product_id):  
    total = 0  
    for sale in inventory[product_id]["sales"]:  
        total += sale * inventory[product_id]["price"]  
    return total  

3. 扩展功能:按价格排序商品

sorted_products = sorted(  
    inventory.values(),  
    key=lambda x: x["price"],  
    reverse=True  
)  
for product in sorted_products:  
    print(f"{product['name']} - 价格:{product['price']}")  

六、常见问题与最佳实践

1. 键的不可变性陷阱

bad_dict = {[1, 2]: "invalid"}  # 抛出 TypeError  
good_dict = {(1, 2): "valid"}  

2. 修改字典时遍历

在遍历时修改字典可能导致不可预测的错误,建议遍历副本或使用临时列表:

for key in my_dict:  
    if key.startswith("a"):  
        del my_dict[key]  # 可能引发 RuntimeError  

keys_to_remove = [key for key in my_dict if key.startswith("a")]  
for key in keys_to_remove:  
    del my_dict[key]  

3. 性能优化建议

  • 避免频繁的键存在性检查,改用 get()defaultdict
  • 优先使用内置方法(如 update()pop()),而非手动操作。

七、结论

Python3 字典凭借其灵活的键值对结构和高效的查找性能,成为数据管理的首选工具。从基础的创建与操作,到高级的字典推导式和合并技巧,开发者能通过字典实现复杂的数据逻辑。通过本文的案例和代码示例,读者应能掌握字典的核心用法,并将其应用到实际项目中。随着对字典特性的深入理解,你将发现它不仅是数据存储的容器,更是解决问题的高效工具。

延伸阅读:若想进一步提升技能,可探索 collections 模块中的 OrderedDictdefaultdict,或学习字典在数据科学(如 Pandas)中的应用。掌握这些进阶工具,你将能应对更复杂的编程挑战。

最新发布