平时做技术实践时,很多问题不是概念不会,而是细节没串起来。拿“Python基础篇之元组tuple与字典dict用法”来说,它看着像小点,放到项目里常会牵出环境、配置、兼容性和维护成本。下面按实际采用顺序,把思路、关键写法和容易踩坑的地方讲清楚,便于大家直接对照操作。
本篇目标
- 搞懂元组"不可变"到底是什么意思、什么时候用
- 掌握字典的增删改查与遍历
- 学会字典推导式与
get()的安全取值 - 掌握元组/字典解包的实用技巧
第一部分:元组 tuple
新建元组
t1 = (1, 2, 3)
t2 = 1, 2, 3 # 括号可以省略,但不建议
t3 = () # 空元组
t4 = (1,) # 单元素元组,逗号必须有!
t5 = (1) # ❌ 这不是元组,就是数字 1
单元素元组的逗号是新手必踩的坑。
元组不可变
t = (1, 2, 3)
t[0] = 100 # ❌ TypeError
但如果元组里有可变元素,那个元素本身能够改:
t = ([1, 2], "hello")
t[0].append(3)
print(t) # ([1, 2, 3], 'hello') ← 能改,因为改的是列表
元组兼容的操作
t = (1, 2, 3, 2)
len(t) # 4
t[0] # 1
t[::-1] # (2, 3, 2, 1) 切片返回元组
t.count(2) # 2
t.index(3) # 2
3 in t # True
t + (4, 5) # (1, 2, 3, 2, 4, 5) 拼接生成新元组
元组什么时候用
- 数据不应该被修改:如坐标
(x, y)、RGB 颜色(255, 128, 0) - 作为字典的 key(列表不行)
- 函数得到多个值(Python 实际就是得到元组)
- 性能略好于列表,遍历稍快
元组解包(超实用)
# 坐标
x, y = (10, 20)
# 交换变量
a, b = b, a
# 函数返回多个值
def get_user():
return "小庄", 18, "北京"
name, age, city = get_user()
# 用 * 收集剩余
first, *rest = [1, 2, 3, 4]
print(first) # 1
print(rest) # [2, 3, 4]
# 只要首尾
head, *_, tail = [1, 2, 3, 4, 5]
print(head, tail) # 1 5
第二部分:字典 dict
字典是**键值对(key-value)**的无序集合,查询速度极快。
新建字典
user = {"name": "小庄", "age": 18, "city": "北京"}
empty = {}
empty2 = dict()
# 从键值对序列创建
dict([("a", 1), ("b", 2)]) # {'a': 1, 'b': 2}
dict(name="小庄", age=18) # {'name': '小庄', 'age': 18}
查
user = {"name": "小庄", "age": 18}
user["name"] # 小庄
user["gender"] # ❌ KeyError!
user.get("gender") # None 安全,不会报错
user.get("gender", "未知") # 未知 带默认值
"name" in user # True 查 key 是否存在
永远优先用 get(),除非你确定 key 一定存在。
增 / 改
user["gender"] = "男" # key 不存在 = 新增
user["age"] = 20 # key 存在 = 修改
user.update({"age": 21, "job": "程序员"}) # 批量更新
删
user.pop("city") # 删除并返回该值
user.pop("xxx", None) # 不存在时返回 None,不报错
del user["age"] # 直接删
user.clear() # 清空
遍历
user = {"name": "小庄", "age": 18, "city": "北京"}
# 遍历 key(默认)
for k in user:
print(k)
# 遍历 value
for v in user.values():
print(v)
# 遍历键值对(最常用)
for k, v in user.items():
print(f"{k}: {v}")
其他常用方法
user.keys() # 所有 key
user.values() # 所有 value
user.items() # 所有键值对
len(user) # 3
user.setdefault("level", 1) # 有就返回原值,没有就设置
字典推导式
# 生成平方映射
{i: i**2 for i in range(5)} # {0:0, 1:1, 2:4, 3:9, 4:16}
# 过滤
{k: v for k, v in user.items() if v}
# 键值互换
{v: k for k, v in d.items()}
# 两个列表合成字典
keys = ["a", "b", "c"]
vals = [1, 2, 3]
dict(zip(keys, vals)) # {'a': 1, 'b': 2, 'c': 3}
实战:统计词频
text = "apple banana apple orange banana apple"
words = text.split()
count = {}
for word in words:
count[word] = count.get(word, 0) + 1
print(count) # {'apple': 3, 'banana': 2, 'orange': 1}
Python 标准库给了更简洁的做法:
from collections import Counter
count = Counter(words)
print(count.most_common(2)) # [('apple', 3), ('banana', 2)]
常用坑
| 坑 | 说明 |
|---|---|
| 单元素元组要加逗号 | (1) 是整数,(1,) 才是元组 |
d["key"] 不存在会 KeyError | 用 d.get("key", default) |
| 遍历字典时增删 | 会报错,先 list(d.keys()) 转副本 |
| 列表不能做字典 key | 列表不可哈希,用元组代替 |
| Python 3.7 之前字典无序 | 现在有序,但别依赖顺序做逻辑 |
# 遍历时删除的正确写法
d = {"a": 1, "b": 2, "c": 3}
for k in list(d.keys()):
if d[k] < 3:
d.pop(k)
小结
- 元组不可变,适合存坐标、设置、做字典 key;解包很便于
- 字典查改都用
get()更安全 - 遍历键值对用
.items() - 推导式、
zip()、Counter是统计类任务的利器
练习题
- 定义元组存"某商品的名称、单价、库存",用解包取出三个值同时打印。
- 统计一段英文文本中每个单词出现的次数,输出出现最多的 3 个。
- 落到代码里,把两个字典合同时(相同 key 的值相加),如
{"a":1,"b":2}+{"b":3,"c":4}→{"a":1,"b":5,"c":4}。
结合项目来看,总的来说,Python元组适合结合实际项目边做边理解。先抓住核心思路,再逐步补上细节和边界处理,最后效果会更稳定,也更容易复用。
