开篇碎碎念
玩Python的小伙伴大概率都有过这种经历:代码报错满天飞,排查半天,最后发现是数据结构用错了。想存文本用了列表、想去重用了字典、想固定数据用了可变列表……一步错,步步错。
Python 最核心、使用率100%的五大内置数据结构:str、list、tuple、dict、set,堪称Python的五大门派。它们各自有专属脾气、专属场景、专属坑点,吃透这五个,你写代码至少少踩80%的基础坑。
今天用严谨不枯燥、通俗不敷衍的方式,一次性汇总所有核心知识点、常用代码、避坑指南和选型技巧,新手老手都适用。
1. str 字符串——老实本分的“只读文本打工人”
核心定位
字符串 str 是Python的文本专属容器,用单引号、双引号、三引号包裹,是一个有序、不可变的字符序列。重点记住:不可变是它的最大人设,一旦创建,内部字符绝不允许原地修改。
核心特性(干货牢记)
- 有序可索引:支持下标取值、切片操作,精准截取任意字符
- 彻底不可变:任何修改、替换、拼接操作,都是生成新字符串,原字符串纹丝不动
- 元素单一:只能存储Unicode字符,数字、符号、汉字都算字符,不能存其他数据类型
- 可遍历:支持for循环逐个读取字符
高频常用操作(日常编码够用版)
s = "Hello Python!" 索引切片(左闭右开) print(s[0]) # 取首个字符:H print(s[1:5]) # 切片截取:ello 常用万能方法 s.upper() # 全部转大写 s.lower() # 全部转小写 s.strip() # 去除首尾空格、换行符、制表符 s.split(" ") # 按空格分割,返回列表 "|".join(["1","2","3"]) # 列表拼接为字符串 s.find("Python") # 查找字符下标,无匹配返回-1 s.replace("Hello","Hi") # 字符替换避坑指南 & 适用场景
❌ 千万别用 += 循环拼接大量字符串!因为不可变特性,每次拼接都会新建对象,性能爆炸。
✅ 海量拼接优先用 join(),效率直接拉满。
适用场景:所有文本处理场景,日志解析、文案存储、接口传参、文件名称处理等。
2. list 列表——随心所欲的“万能可变收纳盒”
核心定位
列表 list 是Python最万能、最常用的容器,用 [] 定义,主打一个有序、可变、包容万物。如果不明确该用什么容器,无脑选列表,大概率不会错,堪称数据容器里的“万金油”。
核心特性
- 可变可修改:支持原地增、删、改、查,无需生成新对象
- 有序可重复:元素有固定顺序,允许存在多个一模一样的元素
- 包容性极强:数字、字符串、元组、字典、甚至嵌套列表,通通能存
- 支持索引切片:灵活取值,适配各种数据读取需求
高频常用操作
lst = [1, 2, 3] lst.append(4) # 尾部追加元素(最常用) lst.insert(0, 0) # 指定下标插入元素 lst.pop() # 删除尾部元素,返回被删除的值 lst.pop(1) # 删除指定下标元素 lst.remove(2) # 删除第一个匹配的目标元素 lst.sort() # 原地升序排序 lst.reverse() # 原地反转列表 lst.extend([5,6]) # 合并另一个序列,批量追加避坑指南 & 适用场景
❌ 列表是可变对象,直接赋值属于浅拷贝,修改新列表会影响原列表。
✅ 需要独立数据时,用切片或copy方法拷贝。
适用场景:有序数据集存储、频繁增删数据、临时存储批量数据、循环遍历取值。
3. tuple 元组——顽固守规矩的“只读固定套餐”
核心定位
元组 tuple 用 () 定义,和列表是“亲兄弟”,唯一且最大的区别:天生不可变。如果说列表是可随意改动的草稿,元组就是打印好的正式文件,定稿后绝不允许修改。
核心特性
- 全员不可变:无法增、删、改元素,数据安全不被篡改
- 有序可重复:保留元素顺序,允许重复数据
- 可哈希:能当做字典的key、集合的元素(列表绝对做不到)
- 特殊彩蛋:元组嵌套列表时,外层元组不可变,内部列表依然可以修改
t = (1, [2, 3]) t[1].append(4) # 合法!内部列表可修改 print(t) # (1, [2, 3, 4])高频常用操作
因为不可变,元组没有任何增删改方法,仅支持查询类操作:
t = (1, 2, 2, 3) print(t.count(2)) # 统计元素出现次数 print(t.index(3)) # 查找元素对应下标避坑指南 & 适用场景
❌ 单元素元组必须写 (x,),只写 (x) 会被判定为普通括号,不是元组。
适用场景:固定不变的常量数据、函数多返回值、字典key、防止数据被意外篡改的场景。
4. dict 字典——精准高效的“查表映射神器”
核心定位
字典 dict 用 {key: value} 定义,是Python的键值对映射容器。主打一个按key精准查找,速度秒杀列表遍历,堪称数据查询界的搜索引擎。Python3.7及以上版本,字典默认保留插入顺序。
核心特性
- key严格要求:必须是可哈希类型(str/int/tuple),列表、集合、字典不能当key
- key唯一不重复:重复赋值会直接覆盖旧值;value无限制,可重复、可存任意类型数据
- 查询效率极高:基于哈希表实现,无论数据量多大,查找速度基本恒定
- 可变容器:支持动态增删改键值对
高频常用操作
d = {"name": "张三", "age": 20} d["name"] # 直接取值,key不存在直接报错 d.get("gender", "未知") # 安全取值,无key返回默认值(推荐!) d.keys() # 获取所有键 d.values() # 获取所有值 d.items() # 获取所有键值对(遍历必备) d.pop("age") # 删除指定键,返回对应value d.update({"gender": "男"}) # 批量更新/新增键值对避坑指南 & 适用场景
❌ 遍历字典时,默认遍历的是key,不是value。
❌ 千万不要用可变类型做字典key,直接报错。
适用场景:一对一映射数据存储、配置参数、用户信息、ID对应关系、需要快速精准查询的场景。
5. set 集合——洁癖专治的“去重对比小能手”
核心定位
集合 set 用 {元素} 或 set() 定义,主打自动去重、集合运算,是自带洁癖的数据容器。注意:空集合只能用 set(),{} 是空字典,别搞混!
核心特性
- 元素绝对唯一:自动剔除重复数据,去重效率天花板
- 无序无下标:不支持索引、切片,无法单独取某个元素
- 元素可哈希:不能存储列表、字典、集合等可变类型数据
- 支持数学集合运算:轻松实现交、并、差集对比
高频常用操作
s1 = {1, 2, 3} s2 = {3, 4, 5} s1.add(6) # 添加单个元素 s1.remove(2) # 删除元素,不存在则报错 s1.discard(99) # 安全删除,不存在不报错 核心集合运算 print(s1 | s2) # 并集:合并两个集合,去重 print(s1 & s2) # 交集:取出两个集合共有元素 print(s1 - s2) # 差集:取出s1独有、s2没有的元素 print(s1 ^ s2) # 对称差集:双方各自独有元素避坑指南 & 适用场景
❌ 集合无序,不能通过下标取值,需要有序数据请转列表。
适用场景:批量数据去重、两组数据对比、筛选交集/差异数据、成员快速判断。
终极对比表(一张图吃透所有区别)
| 数据类型 | 是否有序 | 是否可变 | 元素可否重复 | 索引访问 | 核心用途 |
|---|---|---|---|---|---|
| str 字符串 | 有序 | 不可变 | 可重复 | 支持 | 文本存储与处理 |
| list 列表 | 有序 | 可变 | 可重复 | 支持 | 有序可变数据存储 |
| tuple 元组 | 有序 | 不可变 | 可重复 | 支持 | 固定常量、安全数据存储 |
| dict 字典 | 插入有序 | 可变 | key唯一,value可重复 | 按键查询 | 键值映射、快速查表 |
| set 集合 | 无序 | 可变 | 不可重复 | 不支持 | 数据去重、集合对比 |
极简选型口诀(直接照抄够用)
- 处理文字、文本内容 → str
- 存有序数据、需要频繁增删改 → list
- 数据固定、禁止被修改 → tuple
- 存对应关系、需要快速查找数据 → dict
- 数据去重、对比两组数据差异 → set
高频易错终极避坑总结
- 不可变类型(str/tuple):所有修改操作都不会改动原对象,只会生成新对象
- 可哈希禁忌:dict的key、set的元素,绝对不能用list/set/dict
- 空容器误区:[]空列表、{}空字典、set()空集合,切勿混淆
- 字符串拼接禁忌:循环拼接不用 +=,优先 join()
- 字典遍历误区:默认遍历key,需要键值对务必用items()
结尾小结
这五大数据结构是Python的地基,没有花里胡哨的高阶语法,却是所有项目、算法、爬虫、数据分析的核心基础。搞懂它们的特性、差异和适用场景,写代码不再凭感觉,选型精准、报错更少、代码更优雅。