🐸

筛选装配

数据与文本工具python-data-tinkerer-20-the-selective-assembly
奖励: 115 XP
|

筛选装配

上一节里,Hoppy 已经把“遍历并转换”压缩成了更短的装配线。可工匠台上的现实任务很快又往前走了一小步:有些材料要先挑一下,只有合格的那几件才值得继续整理。

这时,列表推导式可以在生成新列表时顺手做一个轻量筛选。今天只加一个简单的 if 条件,让你看清两件事:谁能进入新列表,以及进入后会被整理成什么样子。

先筛一下,再把选中的材料装进新列表

带条件的列表推导式,本质上还是上一节的动作,只是多了一道很轻的门。for 前面的部分决定“留下来的材料会长什么样”,而结尾的 if 决定“哪些材料能通过这道门”。

raw_labels = [" moss lantern ", "ash pin", " mist bead", "fern note"]

selected_labels = [
  raw_label.strip().title()
  for raw_label in raw_labels
  if raw_label.strip().startswith("m")
]

print("Selected labels:", selected_labels)

这里的筛选很轻:只留下清理后以 "m" 开头的标签。你可以把它理解成“先看合不合格,再装配成最终样子”。注意我们依然控制得很保守:条件简单,转换也简单,这样读起来才不会发糊。

筛选和转换可以同行,但不要把可读性挤坏

这节 compare 课最重要的判断是:轻量筛选可以和轻量转换一起写进推导式里,但不是所有情况都适合。只要你发现条件已经绕、转换也绕,普通循环就会重新变成更好的选择。今天我们练的是“刚刚好”的版本,不是把所有逻辑都塞进一行。

1
把循环和 if 收成一个条件推导式

不再先写空的 selected_labels,也不再用循环加 append。改成一个带 if 的列表推导式。

2
分清转换和筛选各负责什么

结果部分继续是 raw_label.strip().title(),说明选中的材料要被整理成什么样;条件部分使用 if raw_label.strip().startswith("m"),说明哪些材料可以被选中。

3
记住可读性的边界

跑起来后,结果里应该只剩下通过门的标签。如果你觉得条件和转换已经开始互相打架,那就说明这段代码更适合回到普通循环了。

推导式里的 if 适合什么场景?

适合那种一眼就能看懂的小筛选,比如前缀、后缀、长度或成员判断。要是条件越来越长,或者你还想塞进更多分支,就先停下来,换回普通循环。

参考答案
点击展开
参考答案:
raw_labels = ["  moss lantern  ", "silver fern  ", " mist bead", "ash pin"]

selected_labels = [
  raw_label.strip().title()
  for raw_label in raw_labels
  if raw_label.strip().startswith("m")
]

print("Selected labels:", selected_labels)
高级技巧
想更进一步?点击展开

这一课故意不讲复杂条件,也不引入三元表达式。现在最重要的是把“筛选”和“生成新列表”这两个动作轻轻搭在一起,并保持它们仍然容易读。

如果你以后遇到的条件越来越复杂,不要觉得非得硬写成推导式。会停下来、会选择普通循环,本身就是一种成熟的可读性判断。

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