4.3 集合
目标
- 用 set 去重和做快速成员判断。
- 掌握并集、交集、差集、对称差。
- 知道
{}是空字典,空集合写set();了解frozenset。
核心概念
创建与基本操作
集合是无序、元素唯一的容器,元素必须可哈希。
Python · 可运行
python
tags = {"python", "agent", "python"} # 重复元素自动去掉
print(tags, len(tags))
tags.add("sdk")
tags.discard("not-exist") # 不存在也不报错;remove 会抛 KeyError
print("agent" in tags) # 成员判断:平均 O(1)
empty = set() # 注意:{} 是空 dict
print(type(empty), type({}))
print(set([3, 1, 3, 2])) # 从可迭代对象创建集合运算
Python · 可运行
python
required = {"city", "date"}
provided = {"city", "unit"}
print(required | provided) # 并集
print(required & provided) # 交集
print(required - provided) # 差集:必填但没提供
print(required ^ provided) # 对称差:只在一边出现
print({"city"} <= provided) # 子集判断保序去重
set 不保证顺序。需要“去重但保持首次出现顺序”时,利用 dict 的插入顺序:
Python · 可运行
python
names = ["get_weather", "get_time", "get_weather"]
print(list(dict.fromkeys(names))) # ['get_weather', 'get_time']frozenset
frozenset 是不可变集合,可哈希,可以作为 dict 的键或放进另一个集合。读码时偶尔见到 ALLOWED = frozenset({...}) 表示“不可修改的常量集合”。
Python · 可运行
python
ALLOWED_ROLES = frozenset({"user", "assistant"})
print("system" in ALLOWED_ROLES)易错点
{}不是空集合,是空字典。- 依赖 set 的顺序:打印顺序可能每次运行不同(字符串哈希随机化),不要据此写逻辑或测试。
- 放入不可哈希元素:
{[1, 2]}抛TypeError。 remove不存在的元素抛KeyError,用discard更安全。
Python · 可运行演示报错
python
s = {["city"]}对照
| 操作 | Python | JS | Java |
|---|---|---|---|
| 创建 | {1, 2} / set() | new Set([1, 2]) | Set.of(1, 2) / new HashSet<>() |
| 添加 | s.add(x) | s.add(x) | s.add(x) |
| 包含 | x in s | s.has(x) | s.contains(x) |
| 并 / 交 / 差 | a | b、a & b、a - b | a.union(b) 等(ES2025) | addAll / retainAll / removeAll |
读代码
校验模型返回的工具参数是否齐全,是集合运算的典型场景:
python
schema = tools[0]["input_schema"]
missing = set(schema["required"]) - set(block.input) # set(dict) 得到键的集合
if missing:
raise ValueError(f"缺少参数:{sorted(missing)}")minimal_agent.py 没有做这类校验(README 中“限制”一节已说明);11.2 的改造练习会补上。
练习
练习 1:缺失的必填参数
实现 missing_params(schema, tool_input):返回 schema["required"] 中、但 tool_input(dict)里没有的键,按字母序排序后的列表。
练习
def missing_params(schema, tool_input):
return []
快捷键:⌘/Ctrl + Enter 提交检查
练习 2:保序去重
实现 unique_in_order(items):去重并保持首次出现顺序。
练习
def unique_in_order(items):
return list(set(items))
快捷键:⌘/Ctrl + Enter 提交检查
小结
- set:无序、唯一、成员判断快;空集合写
set()。 |&-^对应并、交、差、对称差。- 保序去重用
dict.fromkeys。