列表、字典与集合
Python 三大数据结构——掌握它们,代码能力翻倍。
数据结构全景图
graph TD
DS[Python 数据结构] --> SEQ[序列类型]
DS --> MAP[映射类型]
DS --> SET_TYPE[集合类型]
SEQ --> LIST[list 列表]
SEQ --> TUPLE[tuple 元组]
SEQ --> STR[str 字符串]
MAP --> DICT[dict 字典]
SET_TYPE --> SET[set 集合]
SET_TYPE --> FROZEN[frozenset 不可变集合]
LIST --> |可变有序| L1[增删改查 O1/On]
DICT --> |可变无序| D1[键值查找 O1]
SET --> |可变无序| S1[去重集合运算]
style DS fill:#e3f2fd,stroke:#1565c0,stroke-width:2px
style LIST fill:#c8e6c9,stroke:#388e3c,stroke-width:2px
style DICT fill:#fff3e0,stroke:#f57c00,stroke-width:2px
style SET fill:#fce4ec,stroke:#c62828,stroke-width:2px
列表 (list)
"""
列表:有序、可变、允许重复
"""
# === 创建 ===
nums = [1, 2, 3, 4, 5]
mixed = [1, "hello", 3.14, True, [1, 2]]
empty = []
# === 增删改查 ===
fruits = ["苹果", "香蕉", "橙子"]
# 增
fruits.append("葡萄") # 末尾添加
fruits.insert(1, "西瓜") # 指定位置插入
fruits.extend(["芒果", "草莓"]) # 合并列表
# 删
fruits.remove("香蕉") # 按值删除
popped = fruits.pop() # 弹出末尾
del fruits[0] # 按索引删除
# 改
fruits[0] = "菠萝" # 按索引修改
# 查
print(fruits[0]) # 第一个元素
print(fruits[-1]) # 最后一个
print(fruits[1:3]) # 切片 [1, 3)
print("菠萝" in fruits) # 成员检查
print(len(fruits)) # 长度
# === 排序 ===
numbers = [3, 1, 4, 1, 5, 9, 2, 6]
numbers.sort() # 原地排序
print(numbers) # [1, 1, 2, 3, 4, 5, 6, 9]
sorted_desc = sorted(numbers, reverse=True) # 返回新列表
print(sorted_desc)
# 自定义排序
students = [("张三", 85), ("李四", 92), ("王五", 78)]
students.sort(key=lambda s: s[1], reverse=True)
print(students) # 按分数降序
# === 切片进阶 ===
nums = list(range(10)) # [0, 1, 2, ..., 9]
print(nums[::2]) # [0, 2, 4, 6, 8] 步长2
print(nums[::-1]) # [9, 8, ..., 0] 反转
print(nums[2:8:3]) # [2, 5] 从2到8步长3
# === 常用操作 ===
print([1, 2] + [3, 4]) # [1, 2, 3, 4] 拼接
print([0] * 5) # [0, 0, 0, 0, 0] 重复
字典 (dict)
"""
字典:键值对、无序(Python 3.7+ 保持插入顺序)、键唯一
"""
# === 创建 ===
user = {"name": "张三", "age": 25, "role": "developer"}
from_keys = dict.fromkeys(["a", "b", "c"], 0) # {'a': 0, 'b': 0, 'c': 0}
# === 增删改查 ===
# 增/改
user["email"] = "zhangsan@example.com" # 新增
user["age"] = 26 # 修改
user.update({"city": "北京", "age": 27}) # 批量更新
# 查
print(user["name"]) # 直接取(不存在会报错)
print(user.get("phone", "未设置")) # 安全取值(默认值)
# 删
del user["email"] # 删除键
city = user.pop("city", None) # 弹出(不存在返回默认值)
# === 遍历 ===
for key in user: # 遍历键
print(key)
for key, value in user.items(): # 遍历键值对
print(f"{key}: {value}")
for value in user.values(): # 遍历值
print(value)
# === 实用技巧 ===
# setdefault: 不存在则设置
stats = {}
for word in ["apple", "banana", "apple", "cherry", "banana", "apple"]:
stats.setdefault(word, 0)
stats[word] += 1
print(stats) # {'apple': 3, 'banana': 2, 'cherry': 1}
# 字典合并 (Python 3.9+)
defaults = {"theme": "dark", "lang": "zh"}
custom = {"lang": "en", "font_size": 14}
merged = defaults | custom # {'theme': 'dark', 'lang': 'en', 'font_size': 14}
print(merged)
# 嵌套字典
config = {
"database": {
"host": "localhost",
"port": 5432,
"name": "mydb",
},
"cache": {
"host": "localhost",
"port": 6379,
},
}
print(config["database"]["host"]) # localhost
集合 (set)
"""
集合:无序、不重复、支持集合运算
"""
# === 创建 ===
colors = {"红", "绿", "蓝"}
from_list = set([1, 2, 2, 3, 3, 3]) # {1, 2, 3} 自动去重
# === 增删 ===
colors.add("黄") # 添加
colors.discard("红") # 删除(不存在不报错)
colors.remove("绿") # 删除(不存在报错)
# === 集合运算 ===
a = {1, 2, 3, 4, 5}
b = {4, 5, 6, 7, 8}
print(a & b) # {4, 5} 交集
print(a | b) # {1,2,3,4,5,6,7,8} 并集
print(a - b) # {1, 2, 3} 差集
print(a ^ b) # {1,2,3,6,7,8} 对称差集
# === 实用场景 ===
# 去重
names = ["张三", "李四", "张三", "王五", "李四"]
unique = list(set(names))
print(unique) # 去重(注意顺序可能改变)
# 保序去重
unique_ordered = list(dict.fromkeys(names))
print(unique_ordered) # ['张三', '李四', '王五']
# 成员检查(比 list 快得多)
valid_users = {"admin", "editor", "viewer"}
user_role = "admin"
if user_role in valid_users: # O(1) vs list 的 O(n)
print("有效角色")
# 找两个列表的差异
old_users = {"alice", "bob", "charlie"}
new_users = {"bob", "charlie", "diana"}
added = new_users - old_users # {'diana'}
removed = old_users - new_users # {'alice'}
print(f"新增: {added}, 移除: {removed}")
元组 (tuple)
"""
元组:有序、不可变、允许重复
"""
# === 创建 ===
point = (3, 4)
single = (42,) # 单元素元组需要逗号
rgb = (255, 128, 0)
# === 解包 ===
x, y = point
print(f"x={x}, y={y}")
# 带 * 的解包
first, *rest = [1, 2, 3, 4, 5]
print(first) # 1
print(rest) # [2, 3, 4, 5]
head, *middle, tail = [1, 2, 3, 4, 5]
print(middle) # [2, 3, 4]
# === NamedTuple ===
from typing import NamedTuple
class Point(NamedTuple):
x: float
y: float
z: float = 0.0
p = Point(1.0, 2.0)
print(p.x, p.y, p.z) # 1.0 2.0 0.0
print(p[0]) # 1.0(也支持索引)
性能对比
| 操作 | list | dict | set |
|---|---|---|---|
| 按索引访问 | O(1) | - | - |
| 按值查找 | O(n) | O(1) | O(1) |
| 添加元素 | O(1) 末尾 | O(1) | O(1) |
| 删除元素 | O(n) | O(1) | O(1) |
| 内存占用 | 低 | 高 | 中 |
| 有序 | ✅ | ✅ 3.7+ | ❌ |
| 可重复 | ✅ | 键不可 | ❌ |
下一章:推导式与生成器——写出简洁高效的 Pythonic 代码。