成员铃
Hoppy 把回收标签整理好后,森林档案馆深处亮起了一只小铜铃。铃旁边不是长长的登记表,而是一份只保留成员的魔法名单,里面写着 "Pip"、"Mora" 和 "Tala"。
现在门口来了 "Pip"。Hoppy 不需要数名单里有几个人,也不需要关心顺序;守门铃只问一个很直接的问题:这个名字是不是名单成员?如果在,就可以敲铃;不在,就先不能进去。
set 很适合回答“在不在里面”
当你的任务变成“这个东西是不是成员之一”,set 就会很顺手。因为 set 的重点本来就是成员本身,而不是位置。配上 in,你就能直接得到一个布尔结果:在里面就是 True,不在里面就是 False。
bell_members = {"Mira", "Jun", "Pip"}
visitor_name = "Jun"
print("Bell members:", bell_members)
print("Visitor:", visitor_name)
can_ring_bell = visitor_name in bell_members
print("Can ring bell:", can_ring_bell)
这里的 visitor_name in bell_members,读起来就像一句直接的问题:“visitor_name 这个名字在 bell_members 里面吗?” 这正是 set 很有存在感的时刻。你不是在数次数,也不是在比较共同项;你只是想快点知道一个成员是否属于这份名单。
这就是一个轻量白名单任务
很多真实小任务都会长这样:某个标签是否允许通行、某个房间是否在可进入清单里、某个名字是否在成员表里。它们的共同点是一样的:先准备一份“允许集合”,再判断目标值在不在里面。
这节课先把动作练到很清楚就够了:一个 set,一次 in 判断,一个布尔结果。先把这个画面钉牢,下一课再去看集合和集合之间的关系。
starter 已经给了你 bell_members 和 visitor_name。这次你不用造新的集合,重点是拿它来做判断。
用 visitor_name in bell_members 计算结果,并把它存进 can_ring_bell。
你会先看到成员名单和来访名字,再看到 Can ring bell: 这一行。现在最重要的直觉就是:set 不只会去重,它也特别适合做“在不在里面”的判断。
上一课的 set 像是“唯一收藏架”。这一课它变成了一份能拿来做事的名单。只要你要回答“这个东西是不是成员”,set + in 往往就会很自然。
参考答案点击展开点击收起
bell_members = {"Pip", "Mora", "Tala"}
visitor_name = "Pip"
print("Bell members:", bell_members)
print("Visitor:", visitor_name)
can_ring_bell = visitor_name in bell_members
print("Can ring bell:", can_ring_bell)高级技巧想更进一步?点击展开点击收起
现在你还不需要讨论 set 为什么“更快”,也不用提前学交集、差集这些集合关系。先记住这一幅最实用的画面:手里有一份成员集合,眼前有一个待检查的值,而 in 可以帮你立刻得到答案。
当你以后看到白名单、允许名单、黑名单、已登记标签这类任务时,就可以想起今天这只成员铃:真正想问的,其实只是“它在不在里面?”