Python如何简洁筛选多列表中以b/B开头元素并追加到新列表
优化方案
原有代码存在两处可优化点:重复编写遍历逻辑导致代码冗余、仅匹配小写b开头的元素遗漏大写B开头的项,可以通过以下方式简化并修复兼容问题:
核心优化逻辑
- 直接拼接两个待遍历列表,避免编写两段结构完全相同的循环代码
- 判断时将元素首字母统一转为小写(或大写)再比对,同时兼容大小写开头的匹配场景
- 使用Python原生列表推导式替代逐行
append的写法,代码更紧凑,执行效率也更高
注意:不要为了合并遍历逻辑使用嵌套for循环,嵌套写法会把时间复杂度从线性的O(n+m)拉高到平方级的O(n*m),数据量较大时性能会明显下降,直接拼接列表或者用chain遍历两个列表的写法性能和原有分开写循环的性能完全一致,没有额外损耗。
优化后可直接运行的代码
list1 = ['iPad','iPhone','macbook','screen','bottel cap','paper','keyboard', 'mouse','bat','Baseball'] list2 = ['couch','tv','remote control', 'play station', 'chair', 'blanket', 'table', 'mug'] list_letter_b = [item for item in list1 + list2 if item[0].lower() == "b"] print(f"Here is your new list with only items starting with letter b or B: {list_letter_b}")
运行后正确输出结果:
Here is your new list with only items starting with letter b or B: ['bottel cap', 'bat', 'Baseball', 'blanket']
可选场景适配
- 如果数据源可能存在空字符串元素,直接取
item[0]会触发索引报错,可以给判断条件加非空校验:
list_letter_b = [item for item in list1 + list2 if item and item[0].lower() == "b"]
- 如果待处理的列表元素量级很大(百万级以上),直接拼接列表会生成额外副本占用内存,可以用
itertools.chain做惰性遍历,无额外内存开销:
from itertools import chain list_letter_b = [item for item in chain(list1, list2) if item[0].lower() == "b"]
内容的提问来源于stack exchange,提问作者Jorge Daniel Atuesta
相关产品推荐
相关产品推荐

