集合 — 只认「在不在」的去重专家¶
前两种容器管「顺序」,集合管「 membership(成员资格)」。 它不要 顺序——没有索引、没有切片;它只保证两件事:每个元素只出现一次, 查某个元素在不在的速度极快。换来的是数学课上的那套集合运算: 并集、交集、差集,一行一个。列表是储物柜,集合是点名册。
1. 这一章在全书链条里的位置¶
读法建议:集合章是四种容器章里「新概念最少」的一章——无序、唯一、 数学运算,三个词讲完大半。真正要花力气的只有两处:花括号陷阱(§3) 和 remove/discard 的分工(§6)。其余时间,把它当成「列表知识的 一次应用考试」:遇到每个操作,先想「列表里这活怎么干」, 再想「集合里少了什么、多了什么」。
四种容器排成一条「减法链」:列表最全,元组抽走可变性,集合抽走 顺序性——无序换来了两样列表给不了的东西:自动去重和 O(1) 的 成员查询(列表查「在不在」要逐个看,集合一眼锁定)1。 第 14 章的字典会做第二次「映射化」:把「查在不在」升级成 「查在不在,并且告诉我对应的值」。集合是字典的前奏。
2. 顶层全景:集合的三条铁律与三门大炮¶
一个生活锚点:集合是「班级花名册」——没有座位号(无序), 同名只登记一次(唯一),但每节课都能转进转出(可变)。 查「张三在不在班上」,翻名册一眼即得;但问「张三坐第几排」, 名册帮不了你——那是座位表(列表)的活。
铁律一 无序 没有索引、没有切片——元素不排队,只报到
铁律二 唯一 重复元素自动合并,天然去重
铁律三 可变 能加能删(add/remove),但元素本身必须可哈希
大炮一 去重 set(带重复的序列) → 干干净净的集合
大炮二 查询 x in my_set —— 极速回答在不在
大炮三 运算 | 并集 & 交集 - 差集 <= >= 子集/超集
图说:三条铁律是它的性格,三门大炮是它的用途。
3. 核心原理一:创建 — 去重是出生自带的¶
创建是集合章的第一课,也是「集合与列表性格差异」的第一次正面展示: 同一批原料(列表、元组、字符串),过 set() 这一道门,重复全灭。 这道门没有开关、不可关闭——集合的世界里,「只出现一次」不是 选项,是空气。
两种造法,和列表元组同族2:
set() # 空集合
set([1, 2, 2, 3, 3]) # 从列表转 → {1, 2, 3}(重复被自动清除)
set((1, 2, 2, 3, 3)) # 从元组转 → {1, 2, 3}
{1, 2, 3} # 花括号直接写
{1, 2, 2, 3, 3} # 带重复写进去也一样 → {1, 2, 3}
去重发生在出生时:[1, 2, 2, 3, 3] 进 set 就是 {1, 2, 3},
len 从 5 变 32。这是「大炮一」的第一发——数据清洗的
经典起手式:set(原始列表) 再看 len,就知道实际有几种。
主线例子:花括号的身份歧义¶
创建一节埋着全章最大的陷阱,书里用对照实验点破3:
{} 空 → 字典 dict(花括号被字典「先到先得」占了)
{1, 2} → 集合 set(有元素时,冒号缺席,只能是集合)
set() → 空集合的唯一造法
图说:Python 的花括号一符两职——空着给字典,装了无冒号的元素才是集合。
这就是为什么空集合没有字面量写法。
这个设计的背后是第 14 章的伏笔:字典也用花括号,它的元素是
「键:值」对(带冒号)。解析器看到 {} 时按字典处理,看到
{1, 2} 时没冒号,只能是集合。记忆钩子:「空的花名册是一张白纸,
Python 把它先给了字典」。
len() 照旧,但数的是去重后的元素个数:{1, 2, 3, 0, 'a', 4, True}
的 len 是 6 不是 7——因为 True == 1,True 和 1 在集合眼里
是同一个元素,被合并了4。这条冷知识现在混个脸熟即可
(集合按「相等」合并,True 和 1 相等)。
4. 核心原理二:访问 — 没有索引,只剩两条路¶
这是铁律一最直接的后果,也是集合章第一个「撞墙现场」:
写惯列表的人手会不自觉敲 my_set[0]——立刻 TypeError。
撞过一次墙,「无序」就从定义变成了体感。
铁律一的直接后果:my_set[0] 直接 TypeError——
没有 0 号位,元素不排队。能用的访问方式只有两种5:
my_set = {1, 2, 3, 4, 5}
# 路一:遍历(顺序不定!每次打印可能不一样)
for element in my_set:
print(element)
# 路二:成员查询(集合的主业)
if 3 in my_set:
print('Element 3 exists in the set')
练习区的「点名」题把路二用到实战:给定出勤名单 set3 = {Aaron, Ann, Brian, Cathy},挨个查 ['Aaron', 'Amed', 'Ann', 'Brian', 'David'] 在不在——输出五行「X is in set3 / not in set3」, Amed 和 David 落榜6。这套「名册 + 逐个查」的模式,就是 集合的日常主业。
还有第三条「曲线救国」的路:先转列表再按位取。list(my_set)[0]
能拿到「某一个」元素——但因为无序,拿到的是谁不保证,
只能当「随便给我一个」用,不能当「给我第一个」用5。
5. 核心原理三:集合运算 — 数学课的内容,一行的代码¶
数学课上的集合(venn 图里那两个交叠的圆圈)在 Python 里有了 运算符化身——这一节是「数学符号 → 代码符号」的一一翻译, 每种运算两个写法(运算符简写、方法全称),效果相同7。
四个运算,每个都有「运算符」和「方法」两种写法,效果相同7:
set1 = {1, 2, 3}
set2 = {3, 4, 5}
set1 | set2 # 并集 → {1, 2, 3, 4, 5} 两边所有元素
set1.union(set2) # 同上
set1 & set2 # 交集 → {3} 两边都有的
set1.intersection(set2)
set1 - set2 # 差集 → {1, 2} 在 set1 不在 set2
set2 - set1 # → {4, 5} 反向差集!方向敏感
set1.difference(set2)
{2, 3} <= {1, 2, 3, 4} # 子集 → True 左边全在右边里
{1, 2, 3, 4} >= {2, 3} # 超集 → True 右边全在左边里
差集的方向敏感值得停一秒:A - B 和 B - A 通常不同7。
读法口诀:竖线是「或」(| 长得像两根并排的棍子,合起来),
& 是「且」,减号是「除掉」。练习区的水果版(set1 = Apple/Banana/
Cherry,set2 = Blueberry/Cherry/Raspberry/Blackberry)走一遍:
并集六果、交集只有 Cherry、set1-set2 得 {Banana, Apple}、
set2-set1 得另外三果,两组差集互补成并集8——A|B = A + B 的
去重版,A-B 与 B-A 正好分完 | 的两半。
子集/超集练习还有一道判断题值得看:set2_1 <= set_intersect
得 False(set2_1 是三个莓果,set_intersect 只有 Cherry,
显然不是子集)8——「查子集」在业务上就是「这批数据是不是
那批的子集」:权限检查、标签归类,都是它。
6. 核心原理四:增删方法 — remove 和 discard 的分工¶
先建立整体印象:集合的方法论比列表短一半——列表二十几个方法, 集合只有 add、remove、discard、update、clear 五个干活, 加 index/count 两个查询(在总结表里)12。方法少不是缺陷, 是「无序」的副产品:没有位置,就不需要 insert、pop(i)、排序、 翻转这一大家子位置相关的方法。
五个方法,最重要的对比是中间两个9:
my_set = {1, 2, 3}
my_set.add(4) # 加一个 → {1, 2, 3, 4}
my_set.add(4) # 再加一次 → 还是 {1, 2, 3, 4}(重复被忽略)
my_set.remove(2) # 按值删 → {1, 3}
my_set.remove(2) # 再删一次 → KeyError!元素不存在,当场报错
my_set.discard(2) # 安全版删除:不存在也不报错 → {1, 3} 纹丝不动
my_set.update([4,5,6]) # 批量并入 → {1, 3, 4, 5, 6}
my_set.clear() # 清空 → set()
remove vs discard 是本章最容易考的对比:remove 在元素
不存在时抛 KeyError,discard 静默跳过9。书里的练习
故意安排 set1.remove('Pear') 撞墙(KeyError: 'Pear'),
紧接着 set1.discard('Pear') 平安无事——同一目标、两种性格。
选型判据:删之前确定它在,用 remove(报错反而是保护,
帮你抓逻辑漏洞);不确定在不在,用 discard(或者先 in 检查)。
add 与列表 append 对应、update 与 extend 对应——
集合的「进料」也分两档:一个元素 vs 一整个可迭代9。
7. 核心原理五:集合推导式 — 去重版的推导¶
推导式的第三种壳。壳从 [] 换成 {},规则一字不改——
但产物多了一条隐藏属性:无论表达式产出多少重复,集合壳
自动去重。这条属性让集合推导式成为「数 distinct(不同)值」
的专用工具:一批词的首字母有几种?一批随机数撞了几回重?
一行见分晓10。
语法换壳不换药:方括号/圆括号变成花括号10:
squares_set = {x ** 2 for x in range(1, 6)}
# {1, 4, 9, 16, 25}
odd_set = {x for x in [1, 2, 3, 3, 4, 5, 5] if x % 2 != 0}
# {1, 3, 5} —— 输入带重复,输出照样去重
first_chars = {word[0] for word in ['apple', 'banana', 'cherry']}
# {'c', 'b', 'a'} —— 三个单词的首字母,集合版
unique_random = {random.randint(0, 10) for i in range(10)}
# {0, 2, 4, 6, 7, 8, 9, 10} —— 十个随机数只活了七个
四种容器推导式到此集齐,一行总结:推导式的壳决定产物的容器
([] → 列表,() + tuple() → 元组,{} → 集合),壳内的规则
(表达式 + for + if)四者通用。word[0] for word in words
把第 05 章的索引检查和集合的去重合体——「一批词的首字母有
几种」一行答完;随机数那例更妙:造了十个 0–10 的随机数,
集合只收了七个——去重把「碰撞」直接展示给你看10。
8. 什么时候不该用集合:负向清单¶
正向用法前面讲尽,补一张负向清单——出现这些需求时,集合是 错误工具(判据是我们的归纳)15:
| 需求 | 为什么集合不行 | 该用什么 |
|---|---|---|
| 按位置取第 N 个 | 无序,没有第 N 个 | 列表/元组 |
| 保持插入顺序的去重 | 不保序 | §10 的三条正路 |
| 排序输出 | 元素不排队,何来排序 | 转列表再 sorted |
| 存一对对的键值 | 那是字典的活 | 字典(第 14 章) |
| 频繁「取最大/最小」 | 没有位置就没有两端 | 列表 + max/min,或堆 |
| 元素本身要可变(如嵌套列表) | 元素必须可哈希 | 列表装列表 |
六行清单的共同主题:集合为「成员资格」而生,凡需求落在 「顺序、位置、键值、可变成员」上,都是别的容器的领地。 学完第 14 章,这张表会和字典的选择判据合并成一张四容器总表。
9. 运算的完整关系图:从练习数据反推¶
把练习区那两组水果数字代回四个运算,它们之间的恒等关系全部显形78:
set1 = {Apple, Banana, Cherry} 3 果
set2 = {Blueberry, Cherry, Raspberry, Blackberry} 4 果
并 | → 6 果(Cherry 只算一次) len(|) ≤ len1 + len2
交 & → {Cherry} len(&) ≤ min(len1, len2)
差 1-2 → {Banana, Apple} 恰在 1 不在 2
差 2-1 → 三个莓果 恰在 2 不在 1
三条恒等式(对任意集合成立):
① |A| + |B| = |并| + |交| 3 + 4 = 6 + 1 ✓
② 并 = (A-B) + (B-A) + 交 6 = 2 + 3 + 1 ✓
③ A-B 与 B-A 不相交,且都不含交
图说:三条恒等式就是韦恩图(Venn diagram,用圆圈表示集合关系的图)的
算术版——左圆、右圆、重叠区,三块面积怎么加减,代码里就怎么加减。
第 ③ 条值得用一下:判断两个差集「是否互补」可以快速验证你的 运算有没有写反方向——差集结果里混进了交集元素,一定是符号写错了13。
10. 四种容器推导式总收束¶
到本章为止,推导式的四种壳全部登场,一张表为第 11–13 章的推导式 内容收官10:
[x**2 for x in range(5)] # [0, 1, 4, 9, 16] 列表:保序、可重复
tuple(x**2 for x in range(5)) # (0, 1, 4, 9, 16) 元组:保序、只读
{x**2 for x in range(5)} # {0, 1, 4, 9, 16} 集合:无序、去重
三种壳,三个性格:保序可选列表或元组(可变与否定取舍),
要去重只能集合。同一个 x**2 for x in range(5),换壳就换
数据结构的全部性质——推导式是「一个引擎,三款外壳」。
(第四种壳 {键:值 for ...} 属于字典,第 14 章揭晓。)
选型一分钟判据:结果要按顺序、要按位置取吗?→ 列表/元组; 只关心「有哪些、在不在」?→ 集合;要按键取值?→ 字典(下章)。
11. 去重保序问题:集合做不到的事¶
这是集合最常被误用的场景,值得标题级单独讲:数据清洗的第一需求 往往是「去掉重复」,第二需求(常被遗忘)是「别打乱顺序」。 两步需求加在一起,集合就不是答案——它的去重是真的,丢序也是真的。 记住这个组合需求,§10 的三条正路才有存在的意义。
集合去重有个代价:顺序没了。如果你的需求是「去掉重复,
但保留第一次出现的顺序」——常见!——集合直接出局(两次
list(set(...)) 的顺序都不可靠)。三条正路(机制是通用知识,
不在书里)14:
# 路一:字典的键序(Python 3.7+ 字典保插入序)
unique = list(dict.fromkeys([2, 1, 2, 3, 1])) # [2, 1, 3]
# 路二:手写「见过的就跳过」
seen = set(); unique = []
for x in [2, 1, 2, 3, 1]:
if x not in seen:
seen.add(x); unique.append(x) # [2, 1, 3]
# 路三:借助集合 in 的 O(1) 查询做过滤(路二其实就是它)
路二是值得读一遍的模式:集合管查询(set 查重),列表管顺序 (append 保序)——两种容器各干擅长的事,这正是「容器分工」 这个第 11 章 §31 预告的主题的第一次实战。路一最短但藏着 第 14 章的知识,读完字典章回来再看就懂了。
12. 创建练习走查:三种原料的去重账¶
set('Set Constructor') 从字符串 → 11 个元素
原串 16 字符,去重后 11——
重复的 e/t/r/c 各合并
set([3, 0, 2, 1, 0, 2, 1]) 从列表 → {0, 1, 2, 3}
7 个元素去重剩 4,0/2/1 各出现两次
set(['Aaron', 'Ann', 'Aaron', 'Brian', 'Cathy', 'Ann', 'Brian'])
从名单 → 4 人
7 条记录里 Aaron/Ann/Brian 各重复一次
图说:三题的 len 变化(16→11、7→4、7→4)是去重能力的最直白广告。
「名单里实际来了几种人」—— set() 加 len(),一行回答。
第一题的 16→11 还有个细节:字符串转集合连空格都收(11 个元素里 有一个是空格)——集合不限类型,字符、数字、布尔、字符串都能混装, 去重规则一视同仁4。
13. 集合与字典的边界:花括号的两张面孔¶
本章反复出现的 {} 歧义,其实是为第 14 章预热——花括号在
Python 里住着两家:集合(无冒号)与字典(键:值 对)。提前把
两张面孔的分辨法练熟,下章零障碍:
{1, 2, 3} # 集合:set —— 元素之间无冒号
{'a': 1, 'b': 2} # 字典:dict —— 键值之间有冒号
set() # 空集合(无字面量)
{} # 空字典(字面量被字典占走)
分辨口诀:看花括号里有没有冒号。
有冒号 → 键值对 → 字典;没冒号 → 元素列表 → 集合。
空的 → 默认字典(先到先得,集合让路)。
图说:同一个符号,两种数据结构——这是 Python 语法里最著名的
「一符两职」,集合章的陷阱就是字典章的入门。
同一个 in 运算符,两家也都通用:x in {集合} 查元素在不在,
k in {字典} 查键在不在——写法相同,底层都是哈希查询,速度都快。
第 14 章讲完字典回头看,这一节就是它的地基。
14. 作者的判断与证据¶
判断(我们的,不是书里的): 集合运算(| & - <= >=)是本章 唯一「学了立刻省时间」的内容——没它,两个名单的「共同成员」 要双重循环几十行;有它,一行。这种「数学运算变成运算符」的 设计,是 Python 把学术语言直接焊进语法的典范。若只能带走一样, 带四个运算符,别带 discard 的细节。 如果错,会错在: 数据科学日常里,集合运算的使用频率其实 不如 pandas 之类的工具——纯 Python 阶段的集合运算是思维训练, 未必是工作日常;但对「编程语言与系统研究」的目标读者, 这正是观察「语言内建数学抽象」的好样本。
- 「无序换查询速度」是集合存在的技术理由,但本书没有展开 复杂度(列表 in 是 O(n)、集合 in 是 O(1))——入门书的 正确克制,GenAI 互动区也只问了「查成员快有什么好处」11。
{}是字典的陷阱放在创建一节并用type()对照演示, 位置选得准——这是集合章被问得最多的新手工伤3。- 「随机数去重」的推导式例子(13.6.1)是全章最有灵气的演示: 一行代码同时讲了推导式、集合去重、随机碰撞三个概念10。
- 总结表(Table 13.1)按「创建/访问/加/并/删/查询」六行收拢, 与正文一致,没有第 11、12 章那种「表比正文宽」的毛病12。
15. 边界与局限¶
判断(我们的,不是书里的): 集合是四种容器里「误用率」最低的—— 因为它的短板太显眼(没有索引!),想误用都难。真正的风险只有一种: 拿它当了「会保持顺序的去重工具」。记住集合不保序,去重需求先问 「顺序要紧吗」,要紧就绕道 §10 的三条正路。 如果错,会错在: 对大数据量且顺序无关的场景,集合是当之无愧 的主力;「误用率低」的前提是读者已经知道它的短板——第一次接触 容器的新手,四个容器一起学时反而容易混,这正是下一章字典讲完后 需要一张四容器总表的原因。
- 没有讲 frozenset(冻结集合)。 集合本身可变,不能当字典键、
不能进别的集合;
frozenset(...)是它的不可变版,补上这两个资格。 用到再学,现在知道名字即可。 - 集合的元素必须可哈希——列表和字典不能进集合
(元组可以,第 12 章的哈希资格在这里第二次兑现)。
{{1, 2}, {3}}直接 TypeError:unhashable type。 这个限制与「集合自身用哈希表实现」互为因果: 查询快的原因(哈希)正是成员必须可哈希的原因。 - 无序带来的两个副作用:一是「打印顺序不代表写入顺序」, 别拿打印顺序当数据依据;二是集合之间没有「第一个」「最后一个」 的概念,凡是依赖位置的需求,先想清楚是不是该用列表。
- 集合之间的「相等」是内容相等,与顺序无关。
{1, 2} == {2, 1}得 True——列表的==要先比长度再比顺序,集合的==只比成员。 这个差异是「无序」的数学表达,写测试断言时别混淆两种容器的相等。 remove的 KeyError 与in的联用模式:不确定时if x in s: s.remove(x),或者干脆 discard。这个「先查后删」 的模式在字典章会再来一遍(get/pop 的默认值套路)。- 集合不会保留插入顺序——如果需要「去重但保序」 (第几个新元素先出现),列表模拟(dict.fromkeys,第 14 章 的知识)或 Python 3.7+ 的字典键序都能做到,集合本身做不到。
pop()在集合里的行为是「随机弹出一个」。 列表的 pop 默认弹末尾(有位置可谈),集合没有位置,pop 弹谁都行—— 官方文档就说弹出「an arbitrary element」。别在集合上依赖 pop 的顺序,那是列表的习惯带错了地方。
16. 可带走的¶
一分钟自查:能否不看资料写出——空集合的正确造法、给集合去重、 并集与差集的写法、remove 和 discard 的区别?四问全对,本章毕业。
自查答案核对:空集合是 set()({} 是字典);去重是 set(序列);
并集 A | B、差集 A - B(方向敏感);remove 对缺失元素
报 KeyError,discard 静默。
- 集合 = 无序 + 唯一 + 可变;铁律:没有索引、没有切片1。
set(序列)自动去重(出生自带,不可关闭); 空集合只能set()造,{}是字典23。- 访问两条路:for 遍历(顺序不定)与
in查询;按位取要先转列表5。 - 运算四件:
|并、&交、-差(方向敏感)、<= >=子超集; 每个都有运算符与方法两种写法7。 add/update进料,remove/discard删除(前者对缺失元素 报 KeyError、后者沉默),clear清空9。- 集合推导式 = 花括号壳的推导式,产物自动去重; 四种壳里只有它管「distinct 计数」10。
- True 和 1 在集合里是同一个元素(集合按「相等」合并); 集合元素必须可哈希。
17. 原文地图¶
使用说明:短语逐字取自原书转码文本,可用
node scripts/book-verify.mjs bitesize-python-beginners 逐条回核;
行号若因重新转码漂移,以短语搜索为准。
| 主题 | 原书章 | 原文位置 |
|---|---|---|
| 集合定义与三大优势 | CHAPTER 13: Set | text/22-ch13-chapter-13-set.txt:15(搜「unordered collection of unique elements」) · text/22-ch13-chapter-13-set.txt:20(搜「removing duplicates」) |
| set() 构造与去重 | 同上 | text/22-ch13-chapter-13-set.txt:36(搜「my_set = set()」) · text/22-ch13-chapter-13-set.txt:42(搜「my_list = [1, 2, 2, 3, 3]」) |
| {} 是字典的陷阱 | 同上 | text/22-ch13-chapter-13-set.txt:57(搜「you must use set()」) · text/22-ch13-chapter-13-set.txt:61(搜「type(example)」) |
| len 与 True==1 | 同上 | text/22-ch13-chapter-13-set.txt:84(搜「my_set = {1, 2, 3, 4, 5}」) · text/22-ch13-chapter-13-set.txt:94(搜「{1, 2, 3,0, 'a', 4, True}」) · text/22-ch13-chapter-13-set.txt:101(搜「Number of elements in the set: 6」) |
| 创建练习(名单去重) | 同上 | text/22-ch13-chapter-13-set.txt:118(搜「'Aaron', 'Ann', 'Aaron'」) |
| 遍历与 in 查询 | 同上 | text/22-ch13-chapter-13-set.txt:134(搜「for element in my_set」) · text/22-ch13-chapter-13-set.txt:141(搜「if 3 in my_set」) |
| 点名练习 | 同上 | text/22-ch13-chapter-13-set.txt:188(搜「Amed is not in set3」) |
| 并集与交集 | 同上 | text/22-ch13-chapter-13-set.txt:207(搜「set1 = {1, 2, 3}」) · text/22-ch13-chapter-13-set.txt:217(搜「Union using |
| 差集的方向性 | 同上 | text/22-ch13-chapter-13-set.txt:245(搜「difference_result1 = set1 - set2」) · text/22-ch13-chapter-13-set.txt:260(搜「from set1: {1, 2}」) · text/22-ch13-chapter-13-set.txt:262(搜「from set2: {4, 5}」) |
| 子集与超集 | 同上 | text/22-ch13-chapter-13-set.txt:268(搜「set1 = {1, 2, 3, 4}」) · text/22-ch13-chapter-13-set.txt:283(搜「subset of set1」) |
| 运算练习(水果版) | 同上 | text/22-ch13-chapter-13-set.txt:288(搜「set1 = {'Apple', 'Banana', 'Cherry'}」) · text/22-ch13-chapter-13-set.txt:294(搜「set_union, len(set_union)」) |
| add/remove/discard/update/clear | 同上 | text/22-ch13-chapter-13-set.txt:344(搜「Adds an element」) · text/22-ch13-chapter-13-set.txt:357(搜「Raises a KeyError」) · text/22-ch13-chapter-13-set.txt:378(搜「safer remove()」) · text/22-ch13-chapter-13-set.txt:391(搜「update(): Adds elements」) · text/22-ch13-chapter-13-set.txt:398(搜「clear(): Removes all」) |
| remove 撞墙与 discard 平安 | 同上 | text/22-ch13-chapter-13-set.txt:422(搜「set1.remove('Pear')」) · text/22-ch13-chapter-13-set.txt:431(搜「KeyError: 'Pear'」) · text/22-ch13-chapter-13-set.txt:434(搜「set1.discard('Pear')」) |
| 集合推导式四例 | 同上 | text/22-ch13-chapter-13-set.txt:461(搜「{expression for item in iterable」) · text/22-ch13-chapter-13-set.txt:471(搜「Duplicates will be removed」) · text/22-ch13-chapter-13-set.txt:477(搜「word[0] for word in words」) · text/22-ch13-chapter-13-set.txt:482(搜「unique intergers」) |
| 总结表 | 同上 | text/22-ch13-chapter-13-set.txt:492(搜「Summary of Python sets」) |
| GenAI 互动区 | 同上 | text/22-ch13-chapter-13-set.txt:512(搜「differ from other data structures」) |
-
出处:「CHAPTER 13: Set」第 3–10 段(
text/22-ch13-chapter-13-set.txt:5,搜「unordered and only hold distinct elements」;:6,搜「don't support indexing or slicing」;:8,搜「uniqueness and membership tests」)。「无序换查询速度」的技术理由(复杂度)是我们的补充表述。 ↩↩ -
出处:「CHAPTER 13: Set」第 30–75 段(
text/22-ch13-chapter-13-set.txt:36,搜「my_set = set()」;:42,搜「my_list = [1, 2, 2, 3, 3]」;:46,搜「Set created using set() constructor and a list: {1, 2, 3}」;:66,搜「my_set = {1, 2, 3}」;:71,搜「duplicate elements」)。创建与去重输出逐字依据原文。 ↩↩↩↩ -
出处:「CHAPTER 13: Set」第 55–69 段(
text/22-ch13-chapter-13-set.txt:57,搜「you must use set()」;:61,搜「type(example)」;:63,搜「dict」)。空花括号的字典归属对照实验逐字依据原文。 ↩↩↩ -
出处:「CHAPTER 13: Set」第 93–101 段(
text/22-ch13-chapter-13-set.txt:94,搜「{1, 2, 3,0, 'a', 4, True}」;:101,搜「Number of elements in the set: 6」)。六元素去重为五(含 True/1 合并)的演示见原文;「True == 1 所以合并」的机制是通用知识。 ↩↩ -
出处:「CHAPTER 13: Set」第 127–157 段(
text/22-ch13-chapter-13-set.txt:134,搜「for element in my_set」;:141,搜「if 3 in my_set」;:152,搜「set_list = list(my_set)」)。两种访问与「转列表按位取」的输出逐字依据原文。 ↩↩↩ -
出处:「CHAPTER 13: Set」第 179–197 段(
text/22-ch13-chapter-13-set.txt:188,搜「Amed is not in set3」;:187–:191,五行点名输出;:194,搜「list3 = list(set3)」)。点名练习输出逐字依据原文。 ↩↩ -
出处:「CHAPTER 13: Set」第 199–284 段(
text/22-ch13-chapter-13-set.txt:204,搜「union()): The union」;:221,搜「only elements that are common」;:238,搜「in A but not in B」;:238,搜「directional」;:265,搜「Subset and Superset Testing」)。四运算的定义与「方向敏感」的警告逐字依据原文。 ↩↩↩↩↩ -
出处:「CHAPTER 13: Set」第 286–336 段(
text/22-ch13-chapter-13-set.txt:288,搜「set1 = {'Apple', 'Banana', 'Cherry'}」;:294,搜「set_union, len(set_union)」;:303,搜「{'Cherry'} 1」;:310,搜「{'Banana', 'Apple'} 2」;:317,搜「{'Blueberry', 'Blackberry', 'Raspberry'} 3」;:329,搜「set2_1 <= set_intersect」)。水果版练习全部输出逐字依据原文。 ↩↩↩ -
出处:「CHAPTER 13: Set」第 338–451 段(
text/22-ch13-chapter-13-set.txt:344,搜「Adds an element」;:357,搜「Raises a KeyError」;:378,搜「safer remove()」;:391,搜「update(): Adds elements」;:398,搜「clear(): Removes all」;:422,搜「set1.remove('Pear')」;:431,搜「KeyError: 'Pear'」;:434,搜「set1.discard('Pear')」)。五方法与「撞墙/平安」对照输出逐字依据原文。 ↩↩↩↩ -
出处:「CHAPTER 13: Set」第 453–488 段(
text/22-ch13-chapter-13-set.txt:461,搜「{expression for item in iterable」;:471,搜「Duplicates will be removed」;:477,搜「word[0] for word in words」;:480,搜「{'c', 'b', 'a'}」;:482,搜「unique intergers」;:488,搜「{0, 2, 4, 6, 7, 8, 9, 10}」)。四个推导式例的输出逐字依据原文。 ↩↩↩↩↩↩ -
出处:「CHAPTER 13: Set」第 508–533 段(
text/22-ch13-chapter-13-set.txt:526,搜「fast membership checks」)。「查成员快」之问出自 GenAI 互动区;O(1) 与 O(n) 的对比是通用知识补充。 ↩ -
出处:「CHAPTER 13: Set」第 490–506 段(
text/22-ch13-chapter-13-set.txt:492,搜「Summary of Python sets」)。总结表六行见原文。 ↩↩ -
出处:「CHAPTER 13: Set」第 199–284 段(
text/22-ch13-chapter-13-set.txt:202,搜「mathematical operations」)。三条恒等式由练习区输出(第 286–336 段)逐项验证;韦恩图的解读是我们的组织方式。 ↩ -
补充(不在书里,来自通用知识):「字典键序保插入」依据 Python 3.7 起的语言保证;「集合查询 + 列表保序」的分工模式是数据处理的标准做法。 ↩
-
补充(不在书里,来自通用知识):六行负向清单的判据依据四种容器的定义性差异(有序性、可哈希性、键值结构);「堆」是另一种数据结构,入门阶段知道名字即可。 ↩