3
四大数据结构
list / tuple / dict / set
写程序 80% 的时间在跟数据打交道。Python 内置四样"装数据的容器":列表(有序可变)、元组(有序不可变)、字典(键值对)、集合(不重复)。选对容器,代码短一半;选错了,原地抠脚。
列表 list:有序、可变、什么都能装
fruits = ["苹果", "香蕉", "橙子"]
# 增删改查
fruits.append("葡萄") # 末尾追加 → ['苹果','香蕉','橙子','葡萄']
fruits.insert(0, "西瓜") # 插到第0个位置
fruits[1] = "香梨" # 改第二个
del fruits[0] # 删除第一个
fruits.remove("香梨") # 按值删除(删第一个匹配的)
# 切片:跟字符串一样
nums = [0,1,2,3,4,5]
print(nums[1:4]) # [1, 2, 3]
# 列表推导式:一行搞定"把每个元素加工一遍"
squares = [x*x for x in range(5)]
print(squares) # [0, 1, 4, 9, 16]
# 带筛选的推导式:只要偶数
evens = [x for x in range(10) if x % 2 == 0]
print(evens) # [0, 2, 4, 6, 8]
# 排序
nums.sort() # 原地升序
nums.sort(reverse=True) # 降序
names = ["Bob", "alice", "Charlie"]
names.sort(key=lambda s: s.lower()) # 不区分大小写排序
元组 tuple:写死了,改不了
point = (3, 4) # 用小括号
# point[0] = 5 # 这行会报错!元组不能改
# 解包:一口气把元组拆开赋给多个变量
x, y = point
print(x, y) # 3 4
# 交换两个变量,Python 一行搞定,不用临时变量
a, b = 1, 2
a, b = b, a
print(a, b) # 2 1
# 什么时候用元组?返回多个值、坐标、不该被改的常量
def min_max(lst):
return min(lst), max(lst) # 其实返回的是个元组
lo, hi = min_max([3,1,4,1,5])
print(lo, hi) # 1 5
字典 dict:键值对,按名字存东西
user = {
"name": "小明",
"age": 18,
"tags": ["学霸", "篮球"]
}
# 增删改查
print(user["name"]) # 小明
user["age"] = 19 # 改
user["city"] = "南京" # 加新键
del user["tags"] # 删
# .get 比 [] 安全:键不存在时返回 None 而不是报错
print(user.get("phone")) # None(不会崩)
print(user.get("phone", "未填写")) # 未填写
# 遍历
for key, value in user.items():
print(f"{key} = {value}")
# 字典推导式
word = "abc"
char_count = {c: ord(c) for c in word}
print(char_count) # {'a': 97, 'b': 98, 'c': 99}
# defaultdict:不用判断"键存不存在",自动给默认值
from collections import defaultdict
groups = defaultdict(list)
for name in ["张三", "李四", "王二小"]:
groups[len(name)].append(name) # 按键的长度分组
print(dict(groups))
# {2: ['张三', '李四'], 3: ['王二小']}
Enum:别用裸字符串当状态码
from enum import Enum
class OrderStatus(Enum):
PENDING = "待付款"
PAID = "已付款"
SHIPPED = "已发货"
status = OrderStatus.PAID
print(status.value) # 已付款
# 比写 if s == "已付款" 稳:拼错了会立刻报错,不会悄悄跑错分支
集合 set:自动去重,交并差
a = {1, 2, 3, 3, 3} # 大括号,但没键值对就是集合
print(a) # {1, 2, 3} 自动去重
b = {3, 4, 5}
print(a & b) # {3} 交集
print(a | b) # {1,2,3,4,5} 并集
print(a - b) # {1, 2} a 有 b 没有的
# 最常见用途:列表去重
lst = [1, 2, 2, 3, 3, 3]
unique = list(set(lst))
print(unique) # [1, 2, 3] 顺序可能变
选哪个?一张表说清
| 结构 | 一句话定位 | 典型场景 |
|---|---|---|
| list | 有序、可改、允许重复 | 一批待办、一个队列、读出来的 CSV 行。 |
| tuple | 有序、不可改 | 坐标、函数多返回值、当字典键。 |
| dict | 键查值、很快 | 用户信息、计数器、查找表。 |
| set | 不重复、查得快 | 去重、判断在不在、交并差。 |