👋 前言
Hi 大家好,我是木木。整理了几道 LeetCode 之后,我发现一个真理:算法题做不出来,很多时候不是逻辑不行,而是工具没选对。Python 里最常用的三个数据容器:List(列表)、Dict(字典)、Set(集合),它们就像咱们工具箱里的三剑客,各有各的绝招。今天我们先花 5 分钟把这三位“大将”的底牌摸透,以后看到题就知道该派谁上场了!
⚔️ 一号剑客:列表 (List)
代号:[]
特点:有序、可重复、甚至能切片(切开)。
1. 增(怎么往里塞东西?)
li = [1, 2] # append: 乖乖排到队尾(最常用!) li.append(3) # 变成 [1, 2, 3] # insert: 强行插队 # 参数:(插在第几个位置, 插什么) li.insert(0, 99) # 变成 [99, 1, 2, 3] # extend: 两个队伍合并 # 注意:如果你用 append([4,5]),列表会变成 [..., [4,5]] (列表套列表) # 用 extend([4,5]),列表才会变成 [..., 4, 5] (元素融合) li.extend([4, 5])
2. 删(怎么把东西踢出去?)
li = [10, 20, 30, 20] # pop: 按位置删(默认删最后一个) item = li.pop() # 删掉最后一个,并把它返回给你 li.pop(0) # 删掉第 0 个位置的元素 # remove: 按内容删(只删第一个遇到的) li.remove(20) # 删掉第一个 20,后面的 20 还在! # ⚠️ 注意:如果要删的元素不存在,程序会报错!
3. 查与切片(最强技能!)
li = [10, 20, 30, 40, 50] # 按索引查 print(li[0]) # 第一个 print(li[-1]) # 最后一个(倒数第一) # 切片 Slicing [起点 : 终点 : 步长] # 口诀:顾头不顾尾(包含起点,不包含终点) print(li[1:3]) # 取下标 1 到 2 的元素 -> [20, 30] print(li[:2]) # 从头取到下标 1 -> [10, 20] print(li[::-1]) # 步长为负数,相当于把列表倒叙!-> [50, 40, ...]
⚠️ 避坑指南
-
查找速度慢:如果你问列表“这里面有没有 100?”,它得从头到尾挨个翻,速度是 O(N)。如果数据量大,千万别用列表来频繁查数据!
-
越界报错:访问
li[100]如果超过长度,直接报错IndexError。
🗝️ 二号剑客:字典 (Dictionary)
代号:{}
特点:键值对 Key: Value,查找速度快如闪电。
1. 增与改(霸道总裁模式)
字典的“增”和“改”是一个语法。
dct = {"name": "木木", "age": 18}
# 如果 Key 不存在 -> 新增
dct["city"] = "Shanghai"
# 如果 Key 已存在 -> 修改(覆盖旧值)
dct["age"] = 19
2. 查(安全第一!)
# 方法 A:直接查(有风险)
print(dct["name"])
# ⚠️ 风险:如果查一个不存在的 Key,比如 dct["height"],会直接报错 Crash!
# 方法 B:用 get() 方法(木木推荐 ✅)
print(dct.get("height"))
# ✅ 安全:如果 Key 不存在,它会返回 None,不会报错。
print(dct.get("height", 160))
# ✅ 贴心:如果不存在,还可以返回一个默认值 160。
3. 遍历(怎么把字典里的东西都倒出来?)
这是刷题时最常用的循环写法:
dct = {"A": 1, "B": 2}
# 只拿 Key
for key in dct.keys():
print(key)
# 只拿 Value
for val in dct.values():
print(val)
# 同时拿 Key 和 Value(最常用!)
for key, val in dct.items():
print(key, val)
⚠️ 避坑指南
-
Key 不能变:列表
[]不能当 Key,但元组()可以。 -
无序性:虽然 Python 3.7+ 记住了插入顺序,但做题时最好把字典当成无序的,不要依赖它的顺序。
🎒 三号剑客:集合 (Set)
代号:set()
特点:去重、无序、只有 Key。
1. 增与删
s = {1, 2, 3}
# add: 添加
s.add(4)
# remove: 删除(狠人)
# 如果删的东西不存在,会报错 KeyError
s.remove(2)
# discard: 丢弃(温柔)
# 如果删的东西不存在,它就当无事发生,不会报错(推荐 ✅)
s.discard(99)
2. 集合运算(高级玩法)
虽然叫“基础”,但这个功能在某些题里有奇效:
set1 = {1, 2, 3}
set2 = {3, 4, 5}
# 交集(找共同好友):&
print(set1 & set2) # {3}
# 并集(两家人合照):|
print(set1 | set2) # {1, 2, 3, 4, 5}
# 差集(我有你没有):-
print(set1 - set2) # {1, 2} (在 set1 里去掉 set2 有的)
3. 一键去重(必杀技)
这是集合出场率最高的场景:
nums = [1, 2, 2, 3, 3, 3] # 列表 -> 集合(去重) -> 列表 unique_nums = list(set(nums)) print(unique_nums) # [1, 2, 3]
⚠️ 避坑指南
-
不能索引:
s[0]是错的!因为它没顺序。 -
空集合怎么建:
s = {}建的是空字典,s = set()才是空集合。这是新手必踩的坑!
📊 终极对决:到底怎么选?
这是我整理的一张“作弊表”,做题时不知道用啥,看这张图就够了!
| 特性 | List 列表 | Dict 字典 | Set 集合 |
|---|---|---|---|
| 长相 | [1, 2] | {"a": 1} | {1, 2} |
| 是否有序 | ✅ 有序 | ❌ 无序 (视作) | ❌ 无序 |
| 能否重复 | ✅ 能 | ❌ Key不能重复 | ❌ 不能 |
| 查找速度 | 🐢 慢 O(N) | 🚀 快 O(1) | 🚀 快 O(1) |
| 适用场景 | 需要顺序、存一般数据 | 需要键值对应、存关联数据 | 需要去重、快速查是否存在 |
🧠 木木总结
-
要想顺序存数据,用 列表。
-
要想根据 A 找 B,用 字典。
-
要想去重或者只在乎有木有,用 集合。
磨刀不误砍柴工,把这三个工具用顺手了,刷题难度直接减半!大家加油!💪

被折叠的 条评论
为什么被折叠?



