1. Python数据结构概述
Python作为一门高级编程语言,其内置的数据结构设计既简洁又强大。在实际开发中,合理选择数据结构往往能显著提升代码效率和可读性。我见过太多初学者因为数据结构选择不当导致程序性能低下的案例,比如用列表频繁查找元素而不用集合,或者该用元组的地方用了列表导致数据被意外修改。
Python主要内置数据结构包括:
- 列表(List):可变有序序列
- 元组(Tuple):不可变有序序列
- 字典(Dict):键值对映射
- 集合(Set):无序唯一元素集合
- 字符串(String):不可变字符序列
这些数据结构各有特点,理解它们的底层实现原理和适用场景,是写出高效Python代码的基础。接下来我会结合10年开发经验,详细解析每种结构的特性和实战技巧。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 列表(List)深度解析
2.1 列表的核心特性
列表是Python中最常用的数据结构之一,它的底层实现实际上是动态数组。这意味着:
- 随机访问时间复杂度O(1)
- 尾部插入/删除平均O(1),但最坏情况O(n)(需要扩容)
- 中间插入/删除O(n)
python复制# 创建列表的正确姿势
numbers = [1, 2, 3] # 直接初始化
empty_list = [] # 空列表
mixed_list = [1, "text", True, 3.14] # 混合类型
nested_list = [[1,2], [3,4]] # 嵌套列表
注意:列表推导式是创建列表的高效方式,比循环append快3-5倍:
python复制squares = [x**2 for x in range(10)] # [0, 1, 4, 9, ..., 81]
2.2 列表操作实战技巧
切片的高级用法
python复制nums = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(nums[::2]) # 步长2 [0, 2, 4, 6, 8]
print(nums[::-1]) # 反转 [9, 8, ..., 0]
nums[2:5] = [20, 30, 40] # 替换切片
列表合并性能对比
python复制# 方法1:+运算符(创建新列表)
new_list = list1 + list2
# 方法2:extend()(原地修改,更高效)
list1.extend(list2)
# 方法3:解包(Python 3.5+)
combined = [*list1, *list2]
常见坑点
- 浅拷贝问题:
python复制a = [[1,2], [3,4]]
b = a.copy() # 浅拷贝
b[0][0] = 99 # a也会被修改!
# 正确做法:import copy; b = copy.deepcopy(a)
- 循环中修改列表:
python复制# 错误示范(会跳过元素)
for item in lst:
if condition(item):
lst.remove(item)
# 正确做法
lst = [x for x in lst if not condition(x)]
3. 元组(Tuple)的不可变艺术
3.1 为什么需要元组
元组看似是列表的简化版,实则有其独特价值:
- 性能优势:元组创建和访问比列表快约20%
- 线程安全:不可变性天然适合多线程环境
- 字典键:可哈希的特性使其能作为字典键
- 函数返回值:打包多个返回值的最佳选择
python复制# 元组创建的各种姿势
point = (10, 20) # 标准写法
single = (42,) # 单元素必须加逗号
no_paren = 1, 2, 3 # 括号可省略
empty = tuple() # 空元组
3.2 元组解包技巧
python复制# 基本解包
x, y = (10, 20)
# 星号解包
first, *middle, last = (1, 2, 3, 4, 5) # middle = [2,3,4]
# 函数返回多个值
def get_stats(data):
return min(data), max(data), sum(data)/len(data)
min_val, max_val, avg_val = get_stats([1,2,3,4,5])
3.3 命名元组(NamedTuple)
python复制from collections import namedtuple
# 定义类
Person = namedtuple('Person', ['name', 'age', 'job'])
# 实例化
bob = Person(name='Bob', age=30, job='Dev')
# 访问
print(bob.name) # 比普通元组更可读
print(bob[1]) # 仍然支持索引
4. 字典(Dict)的键值魔法
4.1 字典底层原理
Python 3.6+的字典基于紧凑哈希表实现,具有以下特点:
- 平均O(1)的查找、插入、删除
- 保持插入顺序(Python 3.7+官方保证)
- 键必须是可哈希类型(不可变类型如str/int/tuple)
python复制# 字典创建方式对比
d1 = {'a': 1, 'b': 2} # 字面量
d2 = dict(a=1, b=2) # 关键字参数
d3 = dict([('a',1), ('b',2)]) # 可迭代对象
d4 = dict(zip(['a','b'], [1,2])) # zip组合
4.2 字典高级操作
默认值处理
python复制# 传统方式
if key in my_dict:
value = my_dict[key]
else:
value = default_value
# 更优雅的方式
value = my_dict.get(key, default_value)
# 设置默认值(不存在时设置)
my_dict.setdefault(key, default_value)
字典视图
python复制d = {'a':1, 'b':2, 'c':3}
# 动态视图(随字典变化)
keys = d.keys() # dict_keys(['a', 'b', 'c'])
values = d.values() # dict_values([1, 2, 3])
items = d.items()
