【学Python自动化】 5. Python 数据结构学习笔记
一、 列表详解
1 列表方法总结
方法 | 描述 | 等价操作 | rust Vec类似操作 |
---|---|---|---|
list.append(x) | 末尾添加元素 | a[len(a):] = [x] | vec.push(x); |
list.extend(iterable) | 扩展列表 | a[len(a):] = iterable | vec.extend([4, 5, 6]); 或者更高效:vec.extend_from_slice(&[4, 5, 6]); |
list.insert(i, x ) | 指定位置插入 | vec.insert(1,X); | |
list.remove(x) | 删除第一个值为x的元素 | ||
list.pop([i]) | 移除并返回指定位置元素 | vec.pop(); 及vec.remove(1); | |
list.clear() | 清空列表 | del a[:] | vec.clear() |
list.index(x[, start[, end]]) | 返回第一个x的索引 | ||
list.count(x) | 统计x出现次数 | ||
list.sort(*, key=None, reverse=False) | 原地排序 | vec.sort();vec.sort_by( | |
list.reverse() | 原地反转 | ||
list.copy() | 浅拷贝 | a[:] | |
示例代码 |
fruits = ['orange', 'apple', 'pear', 'banana', 'kiwi', 'apple', 'banana']fruits.count('apple') # 2
fruits.index('banana') # 3
fruits.index('banana', 4) # 6 (从索引4开始找)fruits.reverse() # 反转列表
fruits.append('grape') # 添加元素
fruits.sort() # 排序
fruits.pop() # 移除并返回最后一个元素
2 用列表实现堆栈(LIFO)
stack = [3, 4, 5]
stack.append(6) # 压栈 → [3, 4, 5, 6]
stack.append(7) # 压栈 → [3, 4, 5, 6, 7]
stack.pop() # 出栈 → 7, 栈变为 [3, 4, 5, 6]
stack.pop() # 出栈 → 6, 栈变为 [3, 4, 5]
3 用列表实现队列(FIFO)- 不推荐
# 效率低,推荐使用 collections.deque
from collections import dequequeue = deque(["Eric", "John", "Michael"])
queue.append("Terry") # 入队
queue.append("Graham") # 入队
queue.popleft() # 出队 → 'Eric'
queue.popleft() # 出队 → 'John'
4 列表推导式
基本语法
# 传统方式
squares = []
for x in range(10):squares.append(x**2)# 列表推导式(推荐)
squares = [x**2 for x in range(10)]
复杂示例
# 条件过滤
vec = [-4, -2, 0, 2, 4]
[x for x in vec if x >= 0] # [0, 2, 4]# 应用函数
freshfruit = [' banana', ' loganberry ', 'passion fruit ']
[weapon.strip() for weapon in freshfruit] # 去除空格# 嵌套循环
[(x, y) for x in [1,2,3] for y in [3,1,4] if x != y]# 展平嵌套列表
vec = [[1,2,3], [4,5,6], [7,8,9]]
[num for elem in vec for num in elem] # [1,2,3,4,5,6,7,8,9]
5 嵌套的列表推导式
matrix = [[1, 2, 3, 4],[5, 6, 7, 8],[9, 10, 11, 12],
]# 转置矩阵
transposed = [[row[i] for row in matrix] for i in range(4)]
# [[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]# 更简洁的方式(推荐)
list(zip(*matrix))
二、 del 语句
a = [-1, 1, 66.25, 333, 333, 1234.5]del a[0] # 删除索引0的元素 → [1, 66.25, 333, 333, 1234.5]
del a[2:4] # 删除切片 → [1, 66.25, 1234.5]
del a[:] # 清空列表 → []
del a # 删除整个变量
三、元组和序列
元组基本操作
# 创建元组
t = 12345, 54321, 'hello!' # 打包
t[0] # 12345# 解包
x, y, z = t# 嵌套元组
u = t, (1, 2, 3, 4, 5)# 不可变性(会报错)
# t[0] = 88888# 包含可变对象的元组
v = ([1, 2, 3], [3, 2, 1])
v[0][0] = 999 # 可以修改列表内容
特殊元组
empty = () # 空元组
singleton = 'hello', # 单元素元组(注意逗号)
len(empty) # 0
len(singleton) # 1
四、集合
集合操作
# 创建集合
basket = {'apple', 'orange', 'apple', 'pear', 'orange', 'banana'}
# {'orange', 'banana', 'pear', 'apple'} (去重)# 成员检测
'orange' in basket # True# 集合运算
a = set('abracadabra') # {'a', 'r', 'b', 'c', 'd'}
b = set('alacazam') # {'a', 'c', 'l', 'm', 'z'}a - b # 差集 {'r', 'd', 'b'}
a | b # 并集 {'a', 'c', 'r', 'd', 'b', 'm', 'z', 'l'}
a & b # 交集 {'a', 'c'}
a ^ b # 对称差集 {'r', 'd', 'b', 'm', 'z', 'l'}# 集合推导式
{x for x in 'abracadabra' if x not in 'abc'} # {'r', 'd'}
五、字典
字典操作
# 创建字典
tel = {'jack': 4098, 'sape': 4139}
tel['guido'] = 4127 # 添加/修改# 访问和删除
tel['jack'] # 4098
del tel['sape'] # 删除键
'guido' in tel # True# 构造函数
dict([('sape', 4139), ('guido', 4127), ('jack', 4098)])
dict(sape=4139, guido=4127, jack=4098) # 关键字参数方式# 字典推导式
{x: x**2 for x in (2, 4, 6)} # {2: 4, 4: 16, 6: 36}
六、循环的技巧
字典循环
knights = {'gallahad': 'the pure', 'robin': 'the brave'}
for k, v in knights.items():print(k, v)
枚举循环
for i, v in enumerate(['tic', 'tac', 'toe']):print(i, v) # 0 tic, 1 tac, 2 toe
并行循环
questions = ['name', 'quest', 'favorite color']
answers = ['lancelot', 'the holy grail', 'blue']
for q, a in zip(questions, answers):print(f'What is your {q}? It is {a}.')
反向和排序循环
# 反向循环
for i in reversed(range(1, 10, 2)):print(i) # 9,7,5,3,1# 排序循环
basket = ['apple', 'orange', 'apple', 'pear', 'orange', 'banana']
for i in sorted(basket): # 按顺序循环print(i)# 去重排序循环
for f in sorted(set(basket)):print(f) # apple, banana, orange, pear
七、深入条件控制
比较运算符
# 链式比较
a < b == c # 等价于 a < b and b == c# 布尔运算
A and not B or C # 等价于 (A and (not B)) or C# 短路特性
string1, string2, string3 = '', 'Trondheim', 'Hammer Dance'
non_null = string1 or string2 or string3 # 'Trondheim'
八、序列比较
字典式顺序比较
(1, 2, 3) < (1, 2, 4) # True
[1, 2, 3] < [1, 2, 4] # True
'ABC' < 'C' < 'Pascal' < 'Python' # True
(1, 2, 3, 4) < (1, 2, 4) # True (前两个元素相等,第一个序列更长)
(1, 2) < (1, 2, -1) # True (第二个序列更长)
(1, 2, 3) == (1.0, 2.0, 3.0) # True (数值相等)
九、重要注意事项
-
列表方法:insert, remove, sort 等方法返回 None,不要期待它们返回值
-
可变性:列表可变,元组不可变
-
集合去重:集合自动去除重复元素
-
字典键:必须是不可变类型(字符串、数字、元组等)
-
循环技巧:善用 enumerate(), zip(), reversed(), sorted(), set()
这些数据结构是Python编程的基础,熟练掌握它们能大大提高编码效率。