Python 核心数据结构详解
Python 提供了多种内置的数据结构,用于高效地存储和操作数据。理解这些结构的特性、使用场景及性能差异是编写高质量 Python 代码的基础。本文将详细介绍列表(List)、元组(Tuple)、集合(Set)和字典(Dictionary)的使用方法、底层原理及最佳实践。
本文详细讲解了 Python 中的核心数据结构,包括列表、元组、集合和字典。文章涵盖了各数据类型的定义、常用方法、代码示例及性能分析。重点阐述了列表的可变性及其作为堆栈和队列的使用方式,对比了列表与 deque 在队列操作上的效率差异。同时介绍了列表推导式的语法糖用法,元组的不可变特性,集合的去重与数学运算功能,以及字典的键值对映射机制。最后总结了不同数据结构的时间复杂度和适用场景,帮助开发者根据实际需求选择最优方案。

Python 提供了多种内置的数据结构,用于高效地存储和操作数据。理解这些结构的特性、使用场景及性能差异是编写高质量 Python 代码的基础。本文将详细介绍列表(List)、元组(Tuple)、集合(Set)和字典(Dictionary)的使用方法、底层原理及最佳实践。
列表是 Python 中最常用的可变序列类型。它允许存储任意类型的对象,并且支持动态调整大小。列表区别于字符串和元组的最重要特点是其可变性(Mutability),即可以在创建后修改其中的元素。
| 方法 | 描述 |
|---|---|
list.append(x) | 在列表末尾添加一个元素 x。时间复杂度为 O(1)。 |
list.extend(L) | 将另一个可迭代对象 L 中的所有元素添加到列表末尾。 |
list.insert(i, x) | 在索引 i 处插入元素 x。由于需要移动后续元素,时间复杂度为 O(n)。 |
list.remove(x) | 删除列表中第一个值为 x 的元素。若不存在则抛出 ValueError。 |
list.pop([i]) | 移除并返回索引 i 处的元素。默认移除最后一个元素。 |
list.clear() | 清空列表中的所有元素。 |
list.index(x) | 返回列表中第一个值为 x 的元素的索引。 |
list.count(x) | 统计元素 x 在列表中出现的次数。 |
list.sort() | 原地对列表进行排序。 |
list.reverse() | 原地反转列表顺序。 |
list.copy() | 返回列表的浅复制。 |
# 基础操作
my_list = [1, 2, 3]
my_list.append(4) # [1, 2, 3, 4]
my_list.insert(0, 0) # [0, 1, 2, 3, 4]
my_list.remove(2) # [0, 1, 3, 4]
removed_item = my_list.pop() # 4, my_list becomes [0, 1, 3]
注意:像 insert, remove, sort 等修改列表的方法通常返回 None,而不是修改后的列表。
列表非常适合用作堆栈(后进先出,LIFO)。
stack = [3, 4, 5]
stack.append(6) # 入栈
stack.append(7)
print(stack.pop()) # 出栈,返回 7
print(stack) # [3, 4, 5, 6]
虽然可以用列表模拟队列(先进先出,FIFO),但效率较低。因为从列表头部弹出元素 (pop(0)) 需要移动所有剩余元素,时间复杂度为 O(n)。
对于高性能队列需求,应使用 collections.deque。
from collections import deque
queue = deque(["Eric", "John"])
queue.append("Terry") # 加入队尾
queue.popleft() # 从队头移除,O(1) 复杂度
列表推导式提供了一种简洁的方式来生成新列表,通常比传统的 for 循环更高效且可读性更强。
vec = [2, 4, 6]
squared = [x * 3 for x in vec] # [6, 12, 18]
可以结合 if 语句来过滤元素。
nums = [1, 2, 3, 4, 5, 6]
even_nums = [x for x in nums if x % 2 == 0] # [2, 4, 6]
用于处理多维数据结构,如矩阵转置。
matrix = [
[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12]
]
# 转置为 4x3 矩阵
transposed = [[row[i] for row in matrix] for i in range(4)]
del 语句用于根据索引删除元素或切片,不同于 pop() 不返回值。
a = [-1, 1, 66.25, 333, 333, 1234.5]
del a[0] # 删除索引 0 的元素
del a[2:4] # 删除切片范围 [2, 4)
del a[:] # 清空整个列表
元组是不可变序列,由逗号分隔的值组成。一旦创建,无法修改其内容。元组常用于保护数据不被意外修改,或作为字典的键(因为不可变对象是可哈希的)。
t = (12345, 'hello!')
# 解包
x, y = t
# 嵌套
u = t, (1, 2, 3)
集合是无序且不重复元素的集。主要用于关系测试和消除重复项。
basket = {'apple', 'orange', 'apple'} # 自动去重
print(basket) # {'apple', 'orange'}
a = set('abracadabra')
b = set('alacazam')
print(a - b) # 差集
print(a | b) # 并集
print(a & b) # 交集
print(a ^ b) # 对称差集
unique_chars = {x for x in 'abracadabra' if x not in 'abc'}
字典是以键值对(Key-Value Pair)形式存储数据的无序集合(Python 3.7+ 保持插入顺序)。键必须是不可变类型(如字符串、数字、元组),值可以是任意类型。
tel = {'jack': 4098, 'sape': 4139}
tel['guido'] = 4127
print(tel['jack']) # 4098
del tel['sape']
print(list(tel.keys()))
print(sorted(tel.keys()))
knights = {'gallahad': 'the pure', 'robin': 'the brave'}
for k, v in knights.items():
print(k, v)
questions = ['name', 'quest']
answers = ['lancelot', 'grail']
for q, a in zip(questions, answers):
print(f'What is your {q}? It is {a}.')
选择合适的容器类型对程序性能至关重要。
deque。Python 的内置数据结构功能强大且灵活。掌握列表、元组、集合和字典的特性,能够显著提升代码效率和可维护性。在实际开发中,应根据数据是否需要修改、是否需要快速查找以及数据量级来选择最合适的数据结构。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online