Python中如何实现更优雅的可逆数字下标转换函数?
优化普通数字与下标数字的双向转换函数
原实现虽然能完成功能,但存在两个可以优化的点:一是每次调用都重复生成转换表,略显低效;二是布尔参数y的语义不够直观,需要看代码才能知道True/False对应的转换方向。
下面给出两种更优的实现方式:
方式一:预定义转换表+语义化参数
提前生成好双向转换表,用更清晰的参数指定转换方向,同时增加参数合法性检查:
# 预生成双向转换表,全局只创建一次 NORMAL_TO_SUB = str.maketrans('0123456789', '₀₁₂₃₄₅₆₇₈₉') SUB_TO_NORMAL = str.maketrans('₀₁₂₃₄₅₆₇₈₉', '0123456789') def convert_digit_subscript(s, mode='to_sub'): if mode == 'from_sub': return s.translate(SUB_TO_NORMAL) elif mode == 'to_sub': return s.translate(NORMAL_TO_SUB) else: raise ValueError("mode参数只能是'to_sub'(转下标)或'from_sub'(转普通数字)")
优势:
- 转换表只初始化一次,多次调用函数时性能更优
mode参数语义明确,调用时不用记忆布尔值对应的操作,比如:- 转下标:
convert_digit_subscript("0123456789")或convert_digit_subscript("0123456789", mode='to_sub') - 转普通数字:
convert_digit_subscript("₀₁₂₃₄₅₆₇₈₉", mode='from_sub')
- 转下标:
- 加入参数校验,避免传入无效值导致意外结果
方式二:自动检测转换方向
如果你的场景大多是纯普通数字或纯下标数字的转换,可以实现自动检测逻辑,无需手动指定转换方向:
NORMAL_TO_SUB = str.maketrans('0123456789', '₀₁₂₃₄₅₆₇₈₉') SUB_TO_NORMAL = str.maketrans('₀₁₂₃₄₅₆₇₈₉', '0123456789') def convert_digit_subscript_auto(s): # 检查字符串中是否包含下标数字 has_subscript = any(char in SUB_TO_NORMAL for char in s) if has_subscript: return s.translate(SUB_TO_NORMAL) else: return s.translate(NORMAL_TO_SUB)
注意:
这种方式适合明确的纯数字场景,如果字符串同时包含普通数字和下标数字(比如"12₃4"),会根据是否存在下标数字优先转为普通数字,若需要处理混合场景,建议还是用方式一手动指定转换方向。
内容的提问来源于stack exchange,提问作者James Baw
相关产品推荐
相关产品推荐

