集合与元组:特殊容器
集合(Set):不重复的容器
集合就像一个"去重器"——扔进去的东西自动去重,而且不保证顺序。
加载代码编辑器中……
| 操作 | Python | JavaScript |
|---|---|---|
| 创建 | {1, 2, 3} | new Set([1, 2, 3]) |
| 添加 | .add(x) | .add(x) |
| 删除 | .remove(x) | .delete(x) |
| 包含 | x in s | s.has(x) |
| 交集 | a & b | 手动 filter |
| 并集 | a | b | new Set([...a, ...b]) |
Python 的集合运算用运算符(
&,|,-),非常直觉。JS 的 Set 没有这些运算符,需要手动实现——这是 JS 的一个短板。
集合的典型用途:去重
加载代码编辑器中……
JS 的
[...new Set(arr)]是一个非常优雅的去重技巧,而且保持原始顺序。Python 的list(set(lst))不保证顺序。
元组(Tuple):不可变的列表
Python 有元组(tuple)——创建后就不能修改。JS 没有原生元组(但有冻结数组的方法)。
加载代码编辑器中……
| Python tuple | JavaScript | |
|---|---|---|
| 语法 | (1, 2, 3) | 没有原生元组 |
| 不可变 | ✅ 内置保证 | Object.freeze() 模拟 |
| 解包 | a, b = (1, 2) | const [a, b] = [1, 2] |
问问 AI
问 AI:"TypeScript 有元组类型吗?和 Python 的元组有什么区别?"
这是一个好问题——因为 TS 的元组 [number, string] 和 Python 的元组在概念上相似但实现完全不同。
🏋️AI 练习
给定两个班级的学生名单:
classA = ["小明", "小红", "小华", "小李"]
classB = ["小红", "小华", "小张", "小王"]
用集合操作求出:
- 两个班都有的学生(交集)
- 所有不重复的学生(并集)
- 只在 A 班不在 B 班的学生(差集)
小结
| 概念 | Python | JavaScript |
|---|---|---|
| 集合 | {1, 2, 3} 内置运算符 | new Set() 方法较弱 |
| 去重 | list(set(lst)) | [...new Set(arr)] |
| 元组 | (1, 2) 不可变 | 没有原生元组 |
| 解包/解构 | a, b = (1, 2) | const [a, b] = [1, 2] |
一句话:Python 的集合运算是杀手级特性,JS 的去重一行代码很优雅。元组是 Python 独有的——JS 用数组 + 规范来代替。