共享架子
成员铃响过之后,Hoppy 终于走进了记录室里面。墙边摆着两只低低的木架:左边放着今天“应该送到”的卷轴标题,右边放着“已经送到”的卷轴标题。它们都不是长列表,而是一组一组的名字。
Hoppy 现在想先回答两个很实际的问题:哪些卷轴两边都有?哪些卷轴明明在请求架上,却还没出现在到货架上?一旦你能把“共同项”和“只在这一边的项”看出来,集合就不只是存成员,还能开始比较关系。
set 不只会判断成员,也能和另一个 set 比较
上一课,你做的是“一个名字在不在这份 set 里”。这一课,画面往前走了一小步:你手里有两个 set,于是可以比较它们的共同部分,以及某一边独有的部分。
requested_scrolls = {"Fern Atlas", "Moon Map", "Bell Log"}
arrived_scrolls = {"Moon Map", "Bell Log", "Sun Note"}
print("Requested scrolls:", requested_scrolls)
print("Arrived scrolls:", arrived_scrolls)
shared_scrolls = requested_scrolls.intersection(arrived_scrolls)
missing_scrolls = requested_scrolls.difference(arrived_scrolls)
print("Shared scrolls:", shared_scrolls)
print("Missing scrolls:", missing_scrolls)
这里的 intersection() 会找出“两边都有”的卷轴,也就是共同项;difference() 则会找出“在请求架里,但不在到货架里”的卷轴,也就是当前还缺失的那一边。
先把关系看成很具体的“共同”和“缺失”
这节课不用把 set 想得太抽象。你完全可以把它当成两只架子的对照动作:先看看重叠了什么,再看看请求里少了什么。对初学者来说,这比背术语更重要。
注意 requested_scrolls.difference(arrived_scrolls) 的方向也有意义:我们不是在问“到货架独有的是什么”,而是在问“请求过、却还没到的是什么”。方向一换,答案就会变。
starter 已经给了你 requested_scrolls 和 arrived_scrolls。这次你不用新造数据,重点是从这两个现成的 set 里读出关系。
用 requested_scrolls.intersection(arrived_scrolls) 得到 shared_scrolls;再用 requested_scrolls.difference(arrived_scrolls) 得到 missing_scrolls。
你会先看到两组原始卷轴,再看到 Shared scrolls: 和 Missing scrolls:。这一课最重要的直觉就是:两个 set 放在一起时,可以直接看“共同部分”和“这一边少了什么”。
因为这两步属于同一组很紧的比较动作。共同项回答“哪一些重叠了”,缺失项回答“请求里还差哪一些”。它们一起出现,刚好让“集合关系”变得具体。
参考答案点击展开点击收起
requested_scrolls = {"Moss Atlas", "Star Ledger", "Bell Map"}
arrived_scrolls = {"Star Ledger", "Bell Map", "Lantern Log"}
print("Requested scrolls:", requested_scrolls)
print("Arrived scrolls:", arrived_scrolls)
shared_scrolls = requested_scrolls.intersection(arrived_scrolls)
missing_scrolls = requested_scrolls.difference(arrived_scrolls)
print("Shared scrolls:", shared_scrolls)
print("Missing scrolls:", missing_scrolls)高级技巧想更进一步?点击展开点击收起
现在你还不需要背更多集合操作符,也不用进入更抽象的数学语言。先把这个画面记住:两份成员集合摆在眼前时,你可以比较它们重叠了什么,也可以比较其中一边少了什么。
以后当你看到“报名名单 vs 到场名单”、“请求标签 vs 已到标签”、“需要材料 vs 已备材料”这种任务时,就可以想起今天这只共享架子:集合除了判断成员,还能帮你看关系。