筛选装配
上一节里,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 课最重要的判断是:轻量筛选可以和轻量转换一起写进推导式里,但不是所有情况都适合。只要你发现条件已经绕、转换也绕,普通循环就会重新变成更好的选择。今天我们练的是“刚刚好”的版本,不是把所有逻辑都塞进一行。
不再先写空的 selected_labels,也不再用循环加 append。改成一个带 if 的列表推导式。
结果部分继续是 raw_label.strip().title(),说明选中的材料要被整理成什么样;条件部分使用 if raw_label.strip().startswith("m"),说明哪些材料可以被选中。
跑起来后,结果里应该只剩下通过门的标签。如果你觉得条件和转换已经开始互相打架,那就说明这段代码更适合回到普通循环了。
适合那种一眼就能看懂的小筛选,比如前缀、后缀、长度或成员判断。要是条件越来越长,或者你还想塞进更多分支,就先停下来,换回普通循环。
参考答案点击展开点击收起
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)高级技巧想更进一步?点击展开点击收起
这一课故意不讲复杂条件,也不引入三元表达式。现在最重要的是把“筛选”和“生成新列表”这两个动作轻轻搭在一起,并保持它们仍然容易读。
如果你以后遇到的条件越来越复杂,不要觉得非得硬写成推导式。会停下来、会选择普通循环,本身就是一种成熟的可读性判断。