从“数据容器“的角度,彻底掌握 Python 五大核心数据结构

从“数据容器“的角度,彻底掌握 Python 五大核心数据结构
一、数据结构全景图1.1 一句话认识五大结构# 如果把数据比作物品数据结构就是不同的收纳方式 str hello # 字符的排列像一串珠子 list [1, 2, 3] # 有序的箱子可以随意增删改 tuple (1, 2, 3) # 封存的盒子创建后不能改变 dict {name: 张三} # 带标签的抽屉通过标签找东西 set {1, 2, 3} # 独一无二的收藏柜自动去重1.2 核心特性速查表特性strlisttupledictset是否有序有序有序有序有序3.7无序是否可变不可变可变不可变可变可变是否允许重复-允许允许键唯一元素唯一访问方式整数索引整数索引整数索引键key无索引元素类型限制字符任意任意键不可变元素不可变创建符号 [ ]( ){ }{ }典型场景文本处理动态序列不可变序列键值映射去重/集合运算二、字符串str—— 文本的容器2.1 本质与特性字符串是不可变的字符序列每个字符就像项链上的一颗珠子一旦串好就不能改变。# 创建方式 s1 hello # 单引号 s2 world # 双引号 s3 多行 字符串 # 三引号 s4 str(123) # 类型转换 → 123 # 核心特性不可变 s hello # s[0] H # TypeError: str object does not support item assignment s H s[1:] # 创建新字符串 Hello2.2 常用方法速查s Hello World # 大小写转换 s.upper() # HELLO WORLD s.lower() # hello world s.capitalize() # hello world s.title() # Hello World # 去除空白 s.strip() # Hello World s.lstrip() # Hello World s.rstrip() # Hello World # 查找与判断 s.find(World) # 8返回索引不存在返回 -1 s.index(World) # 8不存在抛出 ValueError s.startswith( ) # True s.endswith(ld ) # True 123.isdigit() # True abc.isalpha() # True # 分割与拼接 s.split() # [Hello, World] a,b,c.split(,) # [a, b, c] -.join([a,b]) # a-b # 替换 s.replace(World, Python) # Hello Python 2.3 常用场景# 1. 用户输入清洗 username input(请输入用户名).strip().lower() # 2. 格式化输出 name 张三 age 25 print(f姓名{name}年龄{age}) # 3. 字符串拼接大量拼接用 join result -.join([2026, 07, 21]) # 2026-07-21 # 4. 字符串切片 text Python text[::-1] # nohtyP反转 text[1:4] # yth2.4 记忆要点字符串是不可变的字符序列所有修改操作实际上都是创建新字符串。三、列表list—— 动态的容器3.1 本质与特性列表是可变的有序序列像一个可以随时增减物品的购物车。# 创建方式 lst1 [] # 空列表 lst2 [1, 2, 3] # 直接创建 lst3 list(hello) # [h,e,l,l,o] lst4 [x*2 for x in range(5)] # [0,2,4,6,8] 列表推导式 # 核心特性可变 lst [1, 2, 3] lst[0] 100 # 修改 lst.append(4) # 添加 lst.pop() # 删除3.2 常用方法速查方法说明示例append(x)末尾添加一个元素lst.append(4)extend(iterable)末尾添加多个元素lst.extend([4,5])insert(i, x)指定位置插入lst.insert(0, 0)remove(x)删除第一个匹配项lst.remove(2)pop(i)删除并返回指定位置元素lst.pop(0)clear()清空列表lst.clear()index(x)返回第一个匹配项索引lst.index(3)count(x)统计元素出现次数lst.count(2)sort()原地排序lst.sort()reverse()原地反转lst.reverse()copy()浅拷贝lst2 lst.copy()3.3 常用场景# 1. 数据收集与遍历 students [] while True: name input(输入姓名输入q退出) if name q: break students.append(name) # 2. 栈后进先出 stack [] stack.append(1) # 入栈 stack.append(2) stack.pop() # 出栈 → 2 # 3. 队列先进先出用 collections.deque 更好 from collections import deque queue deque([1, 2, 3]) queue.append(4) # 入队 queue.popleft() # 出队 → 1 # 4. 列表推导式快速生成 squares [x**2 for x in range(10) if x % 2 0] # [0,4,16,36,64]四、元组tuple—— 固定的容器4.1 本质与特性元组是不可变的有序序列像一个被封存的时光胶囊一旦创建就无法改变。# 创建方式 t1 () # 空元组 t2 (1,) # 单元素元组注意逗号 t3 (1, 2, 3) # 直接创建 t4 tuple([1, 2, 3]) # 从列表转换 # 核心特性不可变 t (1, 2, 3) # t[0] 100 # TypeError: tuple object does not support item assignment # 但可以整体重新赋值 t (4, 5, 6) #4.2 常用方法元组的方法很少因为不可变方法说明示例count(x)统计元素出现次数t.count(2)index(x)返回第一个匹配项索引t.index(3)len(t)获取长度len(t)4.3 常用场景# 1. 函数返回多个值 def get_user(): return 张三, 25, 男 # 返回元组 name, age, sex get_user() # 解包赋值 # 2. 字典的键元组是不可变的 locations { (39.9, 116.4): 北京, (31.2, 121.5): 上海 } # 3. 记录不可变的数据 DAYS_OF_WEEK (一, 二, 三, 四, 五, 六, 日) MONTHS (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12) # 4. 赋值 x, y, z (1, 2, 3) a, b b, a # 交换变量五、字典dict—— 映射的容器5.1 本质与特性字典是键值对Key-Value的映射容器像一本真正的字典——通过字键快速找到释义值。# 创建方式 d1 {} # 空字典 d2 {name: 张三, age: 20} # 直接创建 d3 dict(name张三, age20) # 关键字参数 d4 dict([(name,张三), (age,20)]) # 从键值对列表 # 核心特性通过键访问 d {name: 张三, age: 20} print(d[name]) # 张三 d[city] 北京 # 新增5.2 常用方法速查方法说明示例d[key]访问键不存在报错d[name]d.get(key, default)安全访问d.get(score, 0)d.keys()获取所有键d.keys()d.values()获取所有值d.values()d.items()获取所有键值对d.items()d.update(d2)合并字典d.update({age:21})d.pop(key)删除并返回值d.pop(age)d.popitem()删除并返回最后一项d.popitem()d.clear()清空字典d.clear()5.3 常用场景# 1. 计数器统计频次 text hello world count {} for char in text: count[char] count.get(char, 0) 1 print(count) # {h:1, e:1, l:3, o:2, :1, w:1, r:1, d:1} # 2. 配置管理 config { host: localhost, port: 8080, debug: True } port config.get(port, 3000) # 8080 timeout config.get(timeout, 30) # 30默认值 # 3. 数据映射 user {id: 101, name: 张三, age: 20} # 4. 嵌套字典 students { s001: {name: 张三, age: 20}, s002: {name: 李四, age: 21} } print(students[s001][name]) # 张三 # 5. 字典推导式 squares {x: x**2 for x in range(5)} # {0:0, 1:1, 2:4, 3:9, 4:16}5.4 注意事项# 1. 键必须是不可变类型 d { name: 张三, # 字符串 101: 学号, # 数字 (1,2): 坐标, # 元组 # [1,2]: 列表 # 列表不能作为键 # {a:1}: 字典 # 字典不能作为键 } # 2. get() 无法区分键不存在和值为 None d {score: None} print(d.get(score)) # None键存在 print(d.get(score2)) # None键不存在 # 用 in 判断 if score in d: print(d[score])六、集合set—— 唯一的容器6.1 本质与特性集合是无序、唯一的元素容器像一个自动去重的收藏柜——每个物品只能存放一次。# 创建方式 s1 set() # 空集合注意{} 是空字典 s2 {1, 2, 3} # 直接创建 s3 set([1, 2, 2, 3]) # 从列表创建 → {1, 2, 3}自动去重 s4 {x for x in range(5)} # 集合推导式 → {0,1,2,3,4} # 核心特性元素唯一 无序 s {1, 2, 3} s.add(2) # 重复被忽略 s.add(4) # 添加成功 print(s) # {1, 2, 3, 4}顺序可能不同6.2 常用方法速查方法说明示例add(x)添加元素重复忽略s.add(5)update(iterable)批量添加s.update([5,6])remove(x)删除元素不存在报错s.remove(3)discard(x)删除元素不存在忽略s.discard(10)pop()删除并返回任意元素s.pop()clear()清空集合s.clear()union(s2)/|并集s1 | s2intersection(s2)/交集s1 s2difference(s2)/-差集s1 - s2symmetric_difference(s2)/^对称差集s1 ^ s26.3 常用场景# 1. 去重 nums [1, 2, 2, 3, 3, 3, 4] unique list(set(nums)) # [1, 2, 3, 4] # 2. 成员关系判断 vip_users {张三, 李四, 王五} if 张三 in vip_users: print(VIP用户) # 3. 数据比对 old_data {a, b, c} new_data {b, c, d} # 新增的元素 added new_data - old_data # {d} # 删除的元素 removed old_data - new_data # {a} # 保留的元素 kept old_data new_data # {b, c} # 4. 提取文本中的不同字符 text hello world chars set(text) # {h,e,l,o, ,w,r,d} # 5. 统计不同单词 words set(python is great python is powerful.split()) # {python, is, great, powerful}