罗马数字权重字符串拆分函数故障排查求助
问题排查与修正方案
原代码的核心问题
循环范围遗漏最后一个字符
原代码用for i in range(len(xkcd)-1),循环只处理到倒数第二个字符,最后一个字符永远不会被加入结果列表,导致数据丢失。两位组合的处理逻辑错误
当检测到两位字符是有效权重时,仅将当前字符加入临时字符串后continue,但未处理下一个字符,会导致重复判断或遗漏完整的两位权重。比如输入'10',最终只会留下临时字符串里的'1',无法得到正确的10。未考虑多位数权重(3位/4位)
允许的权重里包含100、500、1000这类3位或4位的字符串,但原代码仅检查两位组合,会把'100'错误拆分为'10'和'0',完全不符合预期。
修正后的代码
def split_roman_weights(xkcd): # 将允许的权重转换为字符串集合,便于匹配 admitted_strings = {'1', '5', '10', '50', '100', '500', '1000'} # 按字符串长度从长到短排序,优先匹配更长的有效权重 sorted_admitted = sorted(admitted_strings, key=lambda s: -len(s)) final_list = [] i = 0 total_length = len(xkcd) while i < total_length: matched = False # 优先尝试匹配最长的有效权重 for weight_str in sorted_admitted: str_len = len(weight_str) # 检查当前位置往后的子串是否能匹配 if i + str_len <= total_length and xkcd[i:i+str_len] == weight_str: final_list.append(int(weight_str)) i += str_len matched = True break # 处理非法输入的情况(可选) if not matched: raise ValueError(f"无效的罗马数字权重,位置:{i},字符:{xkcd[i]}") return final_list
代码逻辑说明
- 先将允许的权重转为字符串集合,并按长度从长到短排序,确保优先匹配
1000、100这类长字符串,避免被拆分成短的无效组合。 - 使用
while循环和索引i遍历字符串,每次匹配成功后直接跳过对应长度的字符,不会重复处理。 - 覆盖了所有字符的处理,包括最后一位,同时加入了非法输入的异常处理(可根据需求调整)。
测试输入'10010010010100511',会返回预期的[100, 100, 100, 10, 100, 5, 1, 1]。
内容的提问来源于stack exchange,提问作者MattMlgn
相关产品推荐
相关产品推荐

