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 的数据结构设计简洁且功能强大,无论是处理小型项目还是复杂系统,掌握这些结构都能显著提升开发效率。

对于初学者而言,理解数据结构不仅有助于解决基础问题,还能为后续学习算法、系统设计打下坚实基础。中级开发者则可以通过深入掌握其底层原理,优化代码性能并应对更复杂的场景。

Python3 核心数据结构概述

Python3 内置了多种高效且易用的数据结构,包括列表(List)、元组(Tuple)、字典(Dictionary)和集合(Set)。这些结构各具特点,适用于不同场景。

列表(List):灵活的有序容器

列表是 Python 最常用的数据结构之一,它是一个可变的、有序的集合,能够存储任意类型的元素。

列表的特性与操作

  • 动态大小:列表长度可动态调整,无需预先定义容量。
  • 元素可变性:支持增删改操作。
  • 索引访问:通过索引(从0开始)快速定位元素。

示例代码:

my_list = [1, "apple", 3.14]  
print(my_list[0])  # 输出 1  

my_list.append("banana")  
print(my_list)  # 输出 [1, "apple", 3.14, "banana"]  

my_list[1] = "orange"  
print(my_list)  # 输出 [1, "orange", 3.14, "banana"]  

del my_list[0]  
print(my_list)  # 输出 ["orange", 3.14, "banana"]  

列表的切片操作

通过切片(Slicing),可以快速提取子列表或反转列表:

numbers = [0, 1, 2, 3, 4, 5]  
sub_list = numbers[1:4]       # 从索引1到3(不包含4)  
print(sub_list)               # 输出 [1, 2, 3]  

reversed_numbers = numbers[::-1]  
print(reversed_numbers)       # 输出 [5, 4, 3, 2, 1, 0]  

比喻:列表就像一个可以随时增减书籍的书架,每本书的位置都有明确的编号,方便快速查找和调整。


元组(Tuple):不可变的有序集合

元组与列表类似,但其元素一旦创建便不可修改。这种不可变性使其在需要数据安全性的场景中尤为有用。

元组的优势与使用场景

  • 性能优势:由于不可变性,元组的访问速度比列表更快。
  • 数据安全性:确保数据不会被意外修改,适合存储固定信息(如坐标、日期)。

示例代码:

coordinates = (10, 20)  
print(coordinates[0])  # 输出 10  


x, y = coordinates  
print(f"x: {x}, y: {y}")  # 输出 "x: 10, y: 20"  

字典(Dictionary):键值对的灵活映射

字典是一种无序的、可变的、以键(Key)和值(Value)形式存储数据的结构。每个键必须是唯一的且不可变,而值可以是任意类型。

字典的核心操作

  • 快速查找:通过键直接访问值,时间复杂度接近 O(1)。
  • 动态扩展:支持动态添加或删除键值对。

示例代码:

student = {"name": "Alice", "age": 25, "courses": ["Math", "Physics"]}  
print(student["name"])       # 输出 "Alice"  

student["gender"] = "female"  
print(student)  

print(student.get("email", "Not provided"))  # 输出 "Not provided"  

del student["age"]  

比喻:字典就像一本电话簿,通过姓名(键)快速找到对应的电话号码(值),而无需逐行查找。


集合(Set):无序的唯一元素集合

集合存储一组无序且不重复的元素,常用于数学中的集合操作(如交集、并集)。

集合的特性与操作

  • 唯一性:自动去除重复元素。
  • 高效成员检测:判断元素是否存在的时间复杂度为 O(1)。

示例代码:

fruits = {"apple", "banana", "orange"}  
print("apple" in fruits)  # 输出 True  

set1 = {1, 2, 3}  
set2 = {3, 4, 5}  

union = set1.union(set2)     # {1,2,3,4,5}  
intersection = set1 & set2   # {3}  

fruits.add("grape")  

比喻:集合如同一个自动去重的购物篮,放入重复物品时只会保留一份。


高级数据结构与应用场景

除了内置结构,Python 还可通过组合或第三方库实现更复杂的数据结构,例如栈、队列和链表。

栈(Stack):后进先出(LIFO)

栈是一种特殊的列表,仅允许在末尾(栈顶)进行插入或删除操作。可以用列表模拟,或通过 collections.deque 实现高效操作。

示例:计算器表达式求值

def evaluate_expression(expr):  
    stack = []  
    for token in expr.split():  
        if token == "+":  
            b = stack.pop()  
            a = stack.pop()  
            stack.append(a + b)  
        else:  
            stack.append(int(token))  
    return stack.pop()  

print(evaluate_expression("3 4 + 5 *"))  # 输出 35  

队列(Queue):先进先出(FIFO)

队列允许在队尾添加元素、队头移除元素。Python 的 deque 类提供了高效的实现:

from collections import deque  

queue = deque()  
queue.append("task1")  
queue.append("task2")  

print(queue.popleft())  # 输出 "task1"  

链表(Linked List):动态内存管理

虽然 Python 没有内置链表类型,但可通过类实现。链表在需要频繁插入/删除中间元素时比列表更高效:

class Node:  
    def __init__(self, data):  
        self.data = data  
        self.next = None  

class LinkedList:  
    def __init__(self):  
        self.head = None  

    def append(self, data):  
        new_node = Node(data)  
        if not self.head:  
            self.head = new_node  
            return  
        current = self.head  
        while current.next:  
            current = current.next  
        current.next = new_node  

数据结构选择指南与性能优化

根据场景选择结构

场景需求推荐结构原因说明
需要频繁增删元素列表、链表动态调整且支持快速访问
需要快速查找或哈希字典、集合O(1) 时间复杂度
固定数据不可修改元组安全且性能更高
处理数学集合运算集合内置交并差等高效操作

性能优化技巧

  1. 避免频繁插入/删除列表中间元素:列表的中间操作时间复杂度为 O(n),可考虑用链表或 deque。
  2. 优先使用字典的 get() 方法:比直接访问更安全,避免 KeyError 异常。
  3. 利用生成器减少内存占用:对于大型数据集,用生成器逐次生成元素而非一次性加载列表。

结论与实践建议

掌握 Python3 数据结构是提升编程能力的关键步骤。通过理解列表、元组、字典、集合的特性,开发者能更高效地组织数据并解决实际问题。对于更复杂的场景,结合栈、队列或自定义链表可进一步优化代码性能。

建议读者通过以下方式巩固知识:

  1. 针对每个结构编写练习代码,尝试实现排序、查找等基础算法。
  2. 用数据结构解决真实问题,例如用字典统计文本词频,或用队列实现任务调度系统。
  3. 阅读开源项目代码,观察资深开发者如何选择和组合数据结构。

数据结构是编程世界的“建筑材料”,只有熟练掌握它们,才能构建出高效、优雅的程序大厦。


通过本文的讲解,希望读者能够建立起对 Python3 数据结构的系统性认知,并在实践中灵活运用这些工具。

最新发布