列表、字典与集合
High Contrast
Dark Mode
Light Mode
Sepia
Forest
1 min read139 words

列表、字典与集合

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 代码。