当前位置: 首页 > news >正文

【学Python自动化】 5. Python 数据结构学习笔记

一、 列表详解

1 列表方法总结
方法描述等价操作rust Vec类似操作
list.append(x)末尾添加元素a[len(a):] = [x]vec.push(x);
list.extend(iterable)扩展列表a[len(a):] = iterablevec.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编程的基础,熟练掌握它们能大大提高编码效率。

http://www.dtcms.com/a/360431.html

相关文章:

  • postman带Token测试接口
  • 打工人日报#20250831
  • LangChain核心抽象:Runnable接口深度解析
  • * 和**有时展开,有时收集。*在对可迭代对象展开 **对字典展开。一般只看收集就够了,在函数定义的时候传入参数用
  • 第二十七天-ADC模数转换实验
  • linux系统学习(12.linux服务)
  • 【星闪】Hi2821 | SPI串行外设接口 + OLED显示屏驱动例程
  • 语音芯片3W输出唯创知音WTN6040FP、WT588F02BP-14S、WT588F04AP-14S
  • [回溯+堆优化]37. 解数独
  • Q1 Top IF 18.7 | 基于泛基因组揭示植物NLR进化
  • 高校心理教育辅导系统的设计与实现|基于SpringBoot高校心理教育辅导系统的设计与实现
  • 网格图--Day02--网格图DFS--面试题 16.19. 水域大小,LCS 03. 主题空间,463. 岛屿的周长
  • 技术总体方案设计思路
  • SAP报工与收货的区别(来自deepseek)
  • c++ 二维码、条形码开发实例
  • FFMPEG学习任务
  • 为什么计算机使用补码存储整数:补码的本质
  • 自定义AXI_PWM_v1.0——ZYNQ学习笔记15
  • Ultra Low Power Transceiver for Wireless Body Area Networks中文版
  • Makefile语句解析:头文件目录自动发现与包含标志生成
  • Day 01(01): Hadoop与大数据基石
  • RPC个人笔记(包含动态代理)
  • Qwen2.5-VL代码初步解读
  • 一个从7zip中分离出来的高压缩比文本压缩工具ppmd
  • 使用PowerShell监听本地端口
  • 多线程案例、线程池
  • QT6(QStandardItemModel和QTableView及自定义代理)
  • 第3章 乱码的前世今生-字符集和比较规则
  • 部署在windows的docker中的dify知识库存储位置
  • 常见线程池的创建方式及应用场景