🐸

形状选择

数据与文本工具python-data-tinkerer-14-the-shape-choice
奖励: 110 XP
|

形状选择

记录室这一章快结束时,Hoppy 站到了一张新的分拣台前。台上没有更难的怪物,只有四张很小的任务卡:一张要记住来访顺序,一张要把位置成对收好,一张只想留下不同印记,还有一张要把重复借阅记成次数。

这节课不是再学一个新容器,而是做一次轻 checkpoint:当面前的数据任务不一样时,你能不能开始感觉到,listtuplesetdict 各自更适合站在哪个位置。

四个小站,想要保留的东西并不一样

这一课最重要的,不是背“谁长什么样”,而是问一句更有用的话:这个任务最想保留什么?是顺序?是固定成对?是唯一成员?还是“名字 -> 次数”这种记录关系?

first_visitor = "Nia"
second_visitor = "Sol"
third_visitor = "Tavi"

shelf_zone = "Amber Wing"
shelf_slot = 5

seal_log = ["sun", "fern", "sun", "fern"]
borrow_log = ["Moon Map", "Moon Map", "Bell Log"]

arrival_line = [first_visitor, second_visitor, third_visitor]
locator_card = (shelf_zone, shelf_slot)
unique_seals = set(seal_log)

borrow_counts = {}
for title in borrow_log:
  if title not in borrow_counts:
      borrow_counts[title] = 0

  borrow_counts[title] += 1

print("Arrival line:", arrival_line)
print("Locator card:", locator_card)
print("Unique seals:", unique_seals)
print("Borrow counts:", borrow_counts)

这里其实是在做四次很轻的判断:来访者排队时,顺序要留下来,所以用 list;位置卡只有区域和格号这对固定信息,所以用 tuple;印记日志里重复很多,但我们只关心不同印记,所以用 set;借阅标题会一再出现,而我们想记住每个标题的次数,所以用 dict

先看任务职责,再选结构

你现在不用把四种结构重新各讲一遍,也不用做一题很重的综合项目。先把这条小判断线带走: 要顺序 -> 想起 list固定成对 -> 想起 tuple只留不同 -> 想起 set名字对应结果 -> 想起 dict

这就是本章真正想给你的东西:面对数据时,不再只会说出名字,而是开始会问“这份记录最需要哪种形状”。

1
把前三张任务卡配对到合适的结构

starter 已经给了你三位来访者、一个架位位置、以及一串重复印记。你要分别补出 arrival_linelocator_cardunique_seals,让它们对应 listtupleset

2
把最后一张任务卡整理成 dict 账本

borrow_log 会重复出现卷轴标题。像上一课那样,在现成的 for title in borrow_log 循环里,先处理“第一次见到这个标题”,再给它加 1,把结果收进 borrow_counts

3
运行后观察四条输出线

运行后,你会同时看到四种结构:有顺序的来访名单、固定位置卡、去重后的印记集合、以及标题对应次数的账本。对照输出再问自己一次:每一条线为什么适合这个形状?

一个很够用的小提问

当你拿到一份数据时,先别急着背定义。先问:我最想保留的是顺序、固定组合、唯一成员,还是键值关系?很多时候,结构选择就会自己浮出来。

参考答案
点击展开
参考答案:
first_visitor = "Mira"
second_visitor = "Jun"
third_visitor = "Pip"

shelf_zone = "Fern Wing"
shelf_slot = 3

seal_log = ["sun", "moon", "sun", "leaf", "moon"]
borrow_log = ["Bell Map", "Moss Atlas", "Bell Map", "Star Ledger", "Bell Map", "Moss Atlas"]

arrival_line = [first_visitor, second_visitor, third_visitor]
locator_card = (shelf_zone, shelf_slot)
unique_seals = set(seal_log)

borrow_counts = {}
for title in borrow_log:
  if title not in borrow_counts:
      borrow_counts[title] = 0

  borrow_counts[title] += 1

print("Arrival line:", arrival_line)
print("Locator card:", locator_card)
print("Unique seals:", unique_seals)
print("Borrow counts:", borrow_counts)
高级技巧
想更进一步?点击展开

回头看这一章,你已经见过固定组合、拆开固定组合、唯一成员、成员判断、集合关系,以及把标题整理成次数账本。今天这节 checkpoint 不要求你变成理论专家,只要求你开始形成一个更实用的反应:不同任务,适合不同形状。

带着这点结构选择意识进入下一章会很有用。之后你会慢慢接触“函数应该返回什么形状”,而今天先守住更基础的一步:看见小任务时,能为它挑对容器。

Loading...
终端输出
Terminal
Ready to run...