Python3如何从指定格式字符串列表中提取b_前缀后的最大数字
最优Pythonic实现方案
方案1:海象运算符(Python 3.8+ 推荐)
利用海象运算符:=一次性完成匹配结果的判断和复用,完全避免重复调用match方法,代码简洁易读:
import re ls = ["a", "b_0", "b_1", "b_2", "c", "d_0", "d_1"] p = re.compile(r"b_(\d+)") # 生成器表达式直接传入max,无需额外存储中间列表 res_max = max((int(m.group(1)) for item in ls if (m := p.match(item))), default=0)
说明:
- 海象运算符在判断匹配结果不为None的同时,将匹配对象赋值给变量
m,直接复用无需二次匹配 - 用生成器表达式替代列表推导,内存占用更低,适合处理大规模列表
- 加
default=0参数,当列表中没有符合规则的b_前缀元素时,不会触发max() arg is an empty sequence报错,可根据业务需求调整默认值
方案2:兼容Python 3.8以下版本
如果使用低于3.8的Python版本不支持海象运算符,可以用map+filter组合实现无重复匹配:
import re ls = ["a", "b_0", "b_1", "b_2", "c", "d_0", "d_1"] p = re.compile(r"b_(\d+)") # 先批量匹配,过滤掉None结果 matches = filter(None, map(p.match, ls)) res_max = max((int(m.group(1)) for m in matches), default=0)
可选:无正则高性能实现
如果规则明确就是b_前缀加数字,也可以不用正则,执行性能更高:
ls = ["a", "b_0", "b_1", "b_2", "c", "d_0", "d_1"] res_max = max( (int(item[2:]) for item in ls if item.startswith("b_") and item[2:].isdigit()), default=0 )
内容的提问来源于stack exchange,提问作者robertspierre
相关产品推荐
相关产品推荐

