必须要掌握的几种Python数据结构
必须要掌握的几种Python数据结构
Python作为一门功能强大且易学的编程语言,其丰富的数据结构体系是其核心优势之一。
Python内置基础数据结构
1. 列表(List) - 动态数组
列表是Python中最常用的数据结构之一,它是一个可变序列,可以存储不同类型的元素。
# 创建和操作列表fruits = ["苹果", "香蕉", "橙子"]fruits.append("草莓") # 添加元素print(fruits[1]) # 访问元素: 香蕉fruits[0] = "梨" # 修改元素del fruits[2] # 删除元素列表支持丰富的操作和方法:
- 切片操作:fruits[1:3]
- 列表推导式:[x**2 for x in range(10)]
- 排序:fruits.sort()
- 反转:fruits.reverse()
2. 元组(Tuple) - 不可变序列
元组与列表类似,但创建后不能修改,常用于存储不应更改的数据。
# 元组的基本使用point = (10, 20)rgb = (255, 0, 0) # 红色print(point # 访问元素: 10# 元组解包x, y = point元组的特点:
- 不可变性保证数据安全
- 比列表更节省内存
- 可作为字典的键(因为不可变)
3. 字典(Dictionary) - 键值对映射
字典是Python中高效的键值对存储结构,基于哈希表实现。
# 字典的创建和操作student = {"name": "张三", "age": 20, "score": 95}print(student["name"]) # 访问: 张三student["grade"] = "A" # 添加新键值对del student["age"] # 删除键值对# 字典方法print(student.keys()) # 所有键print(student.values()) # 所有值print(student.items()) # 所有键值对字典的高级应用:
- 字典推导式:{x: x**2 for x in range(5)}
- 默认字典:from collections import defaultdict
- 有序字典:from collections import OrderedDict
4. 集合(Set) - 唯一元素容器
集合是无序且元素唯一的容器,支持数学集合运算。
# 集合操作numbers = {1, 2, 3, 2, 1} # 自动去重: {1, 2, 3}set1 = {1, 2, 3}set2 = {3, 4, 5}# 集合运算print(set1.union(set2)) # 并集: {1, 2, 3, 4, 5}print(set1.intersection(set2)) # 交集: {3}print(set1.difference(set2)) # 差集: {1, 2}集合的典型用途:
- 快速成员测试(比列表快)
- 去除重复元素
- 数学集合运算
高级数据结构实现
1. 栈(Stack) - 后进先出(LIFO)
栈是一种限制插入和删除只能在一端进行的线性表。
class Stack: def __init__(self): self.items = [] def push(self, item): self.items.append(item) def pop(self): return self.items.pop() def is_empty(self): return self.items == [] def peek(self): return self.items[-1] if not self.is_empty() else None# 使用栈检查括号匹配def is_balanced(expression): stack = Stack() pairs = {')': '(', ']': '[', '}': '{'} for char in expression: if char in pairs.values(): stack.push(char) elif char in pairs.keys(): if stack.is_empty() or stack.pop() != pairs[char]: return False return stack.is_empty()print(is_balanced("((1+2)*[3-4])")) # True栈的应用场景:
- 函数调用栈
- 括号匹配检查
- 表达式求值
- 浏览器历史记录
2. 队列(Queue) - 先进先出(FIFO)
队列是一种先进先出的线性表,Python中可使用collections.deque高效实现。
from collections import deque# 基本队列操作queue = deque()queue.append("任务1")queue.append("任务2")print(queue.popleft()) # 任务1# 双端队列dq = deque([1, 2, 3])dq.appendleft(0) # 前端添加dq.pop() # 后端删除队列的变体:
- 优先队列:heapq模块
- 阻塞队列:多线程编程
- 循环队列:固定大小的队列
3. 链表(Linked List)
链表通过节点和指针实现,相比列表在插入删除操作上更高效。
class Node: def __init__(self, data): self.data = data self.next = Noneclass LinkedList: def __init__(self): self.head = None def append(self, data): new_node = Node(data) if not self.head: self.head = new_node return last = self.head while last.next: last = last.next last.next = new_node def print_list(self): temp = self.head while temp: print(temp.data, end=" -> ") temp = temp.next print("None")# 使用链表llist = LinkedList()llist.append(1)llist.append(2)llist.append(3)llist.print_list() # 1 -> 2 -> 3 -> None链表的类型:
- 单链表
- 双链表
- 循环链表
4. 树(Tree)结构
树是重要的非线性数据结构,二叉树是其中最常见的形式。
class TreeNode: def __init__(self, value): self.value = value self.left = None self.right = None# 构建简单二叉树root = TreeNode(1)root.left = TreeNode(2)root.right = TreeNode(3)root.left.left = TreeNode(4)root.left.right = TreeNode(5)# 递归前序遍历def preorder(node): if node: print(node.value) preorder(node.left) preorder(node.right)preorder(root) # 输出: 1 2 4 5 3树的常见类型:
- 二叉树
- 二叉搜索树(BST)
- AVL树(平衡二叉搜索树)
- 堆(完全二叉树)
数据结构的选择与性能分析
1. 时间复杂度比较
操作 | 列表 | 字典 | 集合 |
插入 | O(n) | O(1) | O(1) |
删除 | O(n) | O(1) | O(1) |
查找 | O(n) | O(1) | O(1) |
访问元素 | O(1) | O(1)
| N/A |
2. 数据结构选择
- 需要有序数据:列表或元组
- 快速查找:字典或集合
- 唯一元素:集合
- 键值关联:字典
- 后进先出:栈
- 先进先出:队列
- 层次关系:树结构
3. 应用案例
案例1:使用字典统计词频
def word_count(text): counts = {} for word in text.split(): counts[word] = counts.get(word, 0) + 1 return countstext = "Python is great and Python is easy"print(word_count(text))# 输出: {'Python': 2, 'is': 2, 'great': 1, 'and': 1, 'easy': 1}案例2:使用集合找出共同好友
alice_friends = {"Bob", "Charlie", "Diana"}bob_friends = {"Alice", "Charlie", "Eve"}common_friends = alice_friends.intersection(bob_friends)print(common_friends) # {'Charlie'}数据结构进阶
1. 不可变数据结构
Python中的不可变数据结构(如元组、字符串)在多线程环境下更安全,且可以作为字典的键。
# 使用元组作为字典键locations = { (35.6895, 139.6917): "Tokyo", (40.7128, -74.0060): "New York"}print(locations[(35.6895, 139.6917)]) # Tokyo2. 内存视图与高效数据处理
对于大型数据集,可以使用memoryview或array模块减少内存消耗。
import array# 使用数组代替列表存储大量数值numbers = array.array('i', [1, 2, 3, 4, 5]) # 'i'表示有符号整数print(numbers # 13. 数据结构的扩展库
- NumPy数组:科学计算的高效多维数组
- Pandas DataFrame:表格数据处理
- NetworkX:图结构处理
如果你觉得这篇文章有用,欢迎点赞、转发、收藏、留言、推荐❤!
文章版权声明:除非注明,否则均为边学边练网络文章,版权归原作者所有
