
1 列表list1.1 核心特性列表是最常用的数据类型之一它是一种有序、可变的序列允许元素重复可以存放不同类型的数据。用中括号[]表示。有序元素有固定顺序可通过索引访问可变可以增、删、改元素可重复允许相同元素出现多次可混合可存放任意类型的元素1.2 创建方式# 方式1直接使用中括号 lst1 [1, 2, 3, 4] # 方式2list() 构造从元组/字符串转换 lst2 list((5, 6, 7)) # 方式3range() 生成 lst3 list(range(1, 6)) # [1, 2, 3, 4, 5] # 方式4列表推导式 lst4 [x * 2 for x in range(5)] # [0, 2, 4, 6, 8] # 方式5空列表 lst5 [] lst6 list()1.3 基本操作增删改查# 一、列表的创建 lst1 [1, 2, 3, 4] lst2 list((5, 6, 7)) lst3 list(range(1, 6)) # [1, 2, 3, 4, 5] print(lst1:, lst1) print(lst2:, lst2) print(lst3:, lst3) # 二、增 fruits [apple, banana] fruits.append(orange) # 末尾添加单个元素 print(append:, fruits) fruits.insert(1, grape) # 指定位置插入 print(insert:, fruits) fruits.extend([kiwi, pear]) # 末尾批量添加 print(extend:, fruits) # 三、删 fruits.remove(apple) # 删除指定值不存在会报错 print(remove:, fruits) x fruits.pop() # 删除并返回末尾元素 print(pop 返回:, x, 删除后:, fruits) x fruits.pop(1) # 删除并返回指定索引元素 print(pop(1) 返回:, x) del fruits[0] # 通过索引删除 print(del 后:, fruits) fruits.clear() # 清空列表 print(clear 后:, fruits) # 四、改 nums [10, 20, 30, 40] nums[0] 100 # 按索引修改元素 print(改索引:, nums) nums[1:3] [200, 300] # 切片批量修改 print(改切片:, nums) # 五、查 numbers [5, 8, 2, 9, 1, 8] print(索引访问 [0]:, numbers[0]) # 5 print(负索引 [-1]:, numbers[-1]) # 1 print(切片 [1:4]:, numbers[1:4]) # [8, 2, 9] print(长度:, len(numbers)) print(8 在列表中?, 8 in numbers) # True print(8 出现次数:, numbers.count(8)) # 2 print(9 的索引:, numbers.index(9)) # 3 # 遍历 for n in numbers: print(元素:, n) # 排序与反转 print(排序:, sorted(numbers)) # [1, 2, 5, 8, 8, 9]1.4 关键要点总结操作方法说明增append()末尾添加单个增insert(位置, x)指定位置插入增extend()末尾批量添加删remove(x)按值删除不存在报错删pop(索引)按索引删除并返回删del lst[索引]按索引删除删clear()清空改lst[索] 值直接赋值修改查in/index()/count()各种查询易混淆点append(元素)是把元素当一个整体加入extend(列表)是把列表的元素逐个加入remove(值)删除第一个匹配项pop(索引)按位置删除sort()原地排序 /sorted()返回新列表2 元组tuple2.1核心特性元组是一种有序、不可变的序列一个重要特性是——一旦创建不能修改不能增、删、改元素。用小括号()表示。2.2与列表的区别特性元组()列表[]可变性不可变可变元素顺序有序有序是否可以修改不能能内存/性能更小更快相对较大用途保护数据、字典键通用、动态数据2.3 创建方式# 方式1直接使用小括号 t1 (1, 2, 3) # 方式2省略括号逗号是关键 t2 10, 20, 30 # 方式3tuple() 构造从列表/字符串转换 t3 tuple([4, 5, 6]) # 方式4单元素元组必须有逗号 t4 (7,) # 是元组 t5 (7) # 只是整数 7不是元组 # 方式5空元组 t6 () t7 tuple()2.4 基本操作查这也是核心操作索引访问t[0]切片t[1:3]成员判断in/not in长度len(t)计数/索引t.count(x)、t.index(x)遍历for x in t:2.5 关键要点总结单元素元组必须有逗号(7)是整数(7,)才是元组元组不可变没有增删改所有方法都不会改变元组本身count/index只读元组的优势性能更好、可作字典的键dict的 key、保护数据不被意外修改解包unpackinga, b (1, 2)是元组最常见的用法也用于交换变量可变与不可变对比元组偶尔可包含可变对象如列表但元组自身结构仍不可变3 字典dict3.1 介绍字典是一种以键值对key-value的形式存储数据是一种可变、无序无索引顺序的集合3.2 创建方式1直接使用大括号创建{}userinfo { name: 张三, # Key-Value对键为name值为张三 age: 18, gender: 男 }2使用dict()函数创建dict2 dict( name张三, # keyvalue age28, gender男 )3.3 基本操作方式操作方法要点增stu[key] value、update()对新 key 赋值即新增update()可一次添加多组删pop(key)、del、clear()pop会返回被删的值删除前建议用in判断避免KeyError改stu[key] value对已存在的 key 赋值即修改对不存在的 key 赋值则变成新增查stu[key]、get()、in、items()get()更安全key 不存在不报错还可设默认值4 集合set4.1 集合的定义集合是一个无序、不重复的元素序列用大括号{}表示三大特性无序性元素没有固定顺序不能通过索引访问唯一性自动去重元素不允许重复可变性集合本身是可变的可以增删元素但元素必须是不可变的数字、字符串、元组可以列表、字典不行4.2 创建方式方法示例说明直接使用大括号s {1, 2, 3}最常用set()构造s set([1, 2, 3])可将列表、字符串等转为集合set()创建空集s set()注意{}是字典不是空集合4.3 基本操作增删改查增add(x)添加单个元素update(iterable)批量添加多个元素删remove(x)删除指定元素不存在会报错discard(x)删除指定元素不存在不会报错pop()随机删除一个元素因为无序clear()清空集合改集合没有直接的改因为元素无序且不可变。修改 删除旧元素 添加新元素查in/not in判断元素是否存在遍历for x in s:5 推导式与切片技巧5.1 推导式Comprehension推导式是用一行代码快速生成新容器的语法。有四种列表、集合、字典、生成器。# 一、列表推导式 # 语法: [表达式 for 变量 in 可迭代对象 if 条件] # 基本: 生成1~10的平方 squares [x ** 2 for x in range(1, 11)] print(平方:, squares) # 带条件: 只保留偶数 evens [x for x in range(1, 21) if x % 2 0] print(偶数:, evens) # 嵌套: 九九乘法表两层循环 table [f{i}*{j}{i*j} for i in range(1, 4) for j in range(1, 4)] print(乘法表:, table) # 二、集合推导式自动去重 nums [1, 1, 2, 2, 3, 3, 4] s {x for x in nums} print(集合推导:, s) # {1, 2, 3, 4} # 三、字典推导式 # 交换键值对 d {a: 1, b: 2, c: 3} new_d {v: k for k, v in d.items()} print(字典推导:, new_d) # {1: a, 2: b, 3: c} # 生成平方表 sq_dict {x: x ** 2 for x in range(1, 6)} print(平方表:, sq_dict) # 四、生成器推导式省内存 # 用圆括号惰性求值不一次性占用内存 g (x * x for x in range(5)) print(生成器类型:, type(g)) # generator print(逐个取值:, list(g)) # [0, 1, 4, 9, 16] # 五、与普通写法对比 # 传统写法 evens_traditional [] for x in range(1, 21): if x % 2 0: evens_traditional.append(x) # 推导式一行搞定 evens [x for x in range(1, 21) if x % 2 0] print(两种写法结果一致:, evens_traditional evens)5.2 切片技巧Slice切片用于截取序列的一部分语法序列[开始:结束:步长]适用于列表、元组、字符串。# 切片技巧 # 公式[起始索引:结束索引:步长] # 起始索引默认0结束索引默认列表长度步长默认1 # 负数索引从后往前数-1表示最后一个元素-2表示倒数第二个元素以此类推 # 步长为正数时表示按顺序从左到右取元素为负数时表示按倒序从右到左取元素 # 切片的索引范围是左闭右开 [ 起始索引, 结束索引 ) 区间即不包含结束索引的元素 # 六、基本切片 lst [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] print(取前3个:, lst[:3]) # [0, 1, 2] print(从第3个起:, lst[3:]) # [3, 4, 5, 6, 7, 8, 9] print(取中间:, lst[2:5]) # [2, 3, 4] print(取后3个:, lst[-3:]) # [7, 8, 9] # 七、步长(step)技巧 # lst[开始:结束:步长] print(取偶数位:, lst[::2]) # [0, 2, 4, 6, 8] print(取奇数位:, lst[1::2]) # [1, 3, 5, 7, 9] # 八、倒序(经典技巧) print(反转:, lst[::-1]) # [9, 8, ..., 0] # 九、修改切片 lst2 [0, 1, 2, 3, 4, 5] lst2[1:4] [100, 200, 300] # 用切片赋值修改 print(修改切片:, lst2) # [0, 100, 200, 300, 4, 5] lst3 [0, 1, 2, 3, 4] lst3[1:3] [] # 用切片删除 print(切片删除:, lst3) # [0, 3, 4] # 十、字符串切片应用 s Hello, World print(取单词:, s[7:]) # World print(反向字符串:, s[::-1]) # dlroW ,olleH # 判断回文 word madam print(是否回文:, word word[::-1]) # True5.3 核心技巧速记切片写法作用seq[:n]/seq[-n:]取前 n 个 / 取后 n 个seq[::2]取偶数位置步长应用seq[::-1]反转序列最常用技巧seq[start:end:step]完整切片语法推导式 vs 普通循环推导式更简洁高效追求可读性时控制在一层循环一个条件内逻辑复杂时用传统循环更好读。6 复杂序列数据处理现实中数据往往不是单一类型而是多层嵌套多个序列组合。# 一、嵌套序列列表套列表/字典 # 二维列表类似表格 matrix [ [1, 2, 3], [4, 5, 6], [7, 8, 9] ] print(第1行第2列:, matrix[0][1]) # 2 # 遍历二维列表 for row in matrix: print(行:, row) # 列表套字典常见于数据记录 students [ {name: 张三, score: 90}, {name: 李四, score: 85}, {name: 王五, score: 78}, ] for stu in students: print(f{stu[name]} 考了 {stu[score]} 分) # 二、enumerate同时拿索引和值 fruits [apple, banana, orange] for i, f in enumerate(fruits): print(f索引{i}: {f}) # 还可指定起始编号 for i, f in enumerate(fruits, start1): print(f第{i}个: {f}) # 三、zip多个序列打包 names [张三, 李四, 王五] scores [90, 85, 78] # 打包成元组对 pairs list(zip(names, scores)) print(zip打包:, pairs) # [(张三, 90), ...] # 结合字典 - 一行生成成绩字典 score_dict dict(zip(names, scores)) print(成绩字典:, score_dict) # 遍历多个序列 for name, score in zip(names, scores): print(f{name}: {score}) # zip(*列表) 解包转置 —— 经典技巧 data [(1, 2, 3), (4, 5, 6)] a, b, c zip(*data) print(转置:, a, b, c) # (1, 4) (2, 5) (3, 6) # 四、解包unpacking技巧 nums [1, 2, 3, 4, 5] first, *middle, last nums print(首:, first, 中间:, middle, 尾:, last) # 五、实战学生成绩分析 grades [ {name: 张三, subjects: {语文: 90, 数学: 85, 英语: 78}}, {name: 李四, subjects: {语文: 88, 数学: 92, 英语: 95}}, {name: 王五, subjects: {语文: 70, 数学: 75, 英语: 80}}, ] # 计算每人平均分 for stu in grades: scores stu[subjects].values() avg sum(scores) / len(scores) print(f{stu[name]} 平均分: {avg:.2f}) # 找出所有科目中的最高分 all_scores [s for stu in grades for s in stu[subjects].values()] print(全班最高分:, max(all_scores)) # 按平均分排序sorted 匿名函数 def get_avg(stu): return sum(stu[subjects].values()) / len(stu[subjects]) ranking sorted(grades, keyget_avg, reverseTrue) print(第一名:, ranking[0][name])核心工具速查表工具作用典型用法enumerate()同时获取索引值for i, v in enumerate(lst)zip()多个序列按位打包dict(zip(keys, values))zip(*data)转置解包二维数据行列互换*args解包拆分序列first, *mid, last lstsorted(key...)按自定义规则排序配合匿名函数关键要点嵌套取值多维数据用连续索引如matrix[0][1]字典用键如stu[name]zipdict是拼接键值对的最快捷方式zip(*data)是转置的经典技巧enumerate取代手动维护索引计数器代码更清晰列表推导式的嵌套[s for stu in grades for s in stu[subjects].values()]可扁平方多维数据但控制嵌套在 2 层以内保持可读性sorted(key函数)支持对复杂对象字典、元组列表按任意字段排序7.各个数据类型不同特性字符串 str元组 tuple列表 list字典 dict集合 set定义符号...或...(...)[...]{键: 值}{...}示例abc(1, 2, 3)[1, 2, 3]{a: 1}{1, 2, 3}可变性不可变 ❌不可变 ❌可变 ✅可变 ✅可变 ✅元素顺序有序有序有序有序Python 3.7 按插入序无序可重复元素允许允许允许键唯一、值可重复不允许自动去重下标索引✅s[0]✅t[0]✅l[0]❌用键访问d[a]❌切片✅s[1:3]✅t[1:3]✅l[1:3]❌❌元素类型只能存字符任意任意键任意、值任意必须是可哈希的重复添加/更新拼接生成新串拼接生成新串append/insert/[i]d[key] valueadd()删除不可删除部分切片可得新串不可删除部分remove/pop/deldel d[key]/popdiscard/remove/pop去重用需set()转换需set()转换需set()转换本身键唯一✅ 天生去重查找快索引快索引快索引非常快哈希键查找非常快哈希查找可否作为字典的键✅✅元素也要可哈希❌可变不可哈希❌❌常用方法/特点upper()、split()、join()打包、不可变安全、可做键append、sort、indexkeys()、values()、items()、get()union、intersection、注意:尤其注意可变和有序这些,不能搞混