是否有更优的智利RUT校验位计算方法?
智利RUT校验位计算的优化实现
你的原代码逻辑正确,但可以从减少冗余类型转换、简化分支逻辑和提升扩展性几个方向优化,下面是几种更简洁高效的实现方式:
核心算法回顾
智利RUT校验位的MOD11计算规则:
- 取7-8位数字ID
- 反转数字序列
- 每位数字依次乘以权重序列
[2,3,4,5,6,7,2,3](可扩展适配更长数字) - 求和后对11取模
- 计算
11 - 模值,结果为10时用'K'表示,为11时用'0'表示,其余直接取数字
优化实现方式
方式一:精简版(适配固定长度RUT)
def calculate_rut_digit(rut): reversed_rut = reversed(rut) weights = [2, 3, 4, 5, 6, 7, 2, 3] total = sum(int(d) * w for d, w in zip(reversed_rut, weights)) mod = total % 11 result = 11 - mod return 'K' if result == 10 else '0' if result == 11 else result # 使用示例 rut_input = input("请输入RUT编号:\n") print(f"带校验位的RUT:{rut_input}-{calculate_rut_digit(rut_input)}")
方式二:扩展版(支持任意长度RUT)
如果需要适配更长的RUT数字,可让权重序列循环重复:
from itertools import cycle def calculate_rut_digit(rut): reversed_rut = reversed(rut) weights = cycle([2, 3, 4, 5, 6, 7]) total = sum(int(d) * next(weights) for d in reversed_rut) mod = total % 11 result = 11 - mod return 'K' if result == 10 else '0' if result == 11 else result # 使用示例 rut_input = input("请输入RUT编号:\n") print(f"带校验位的RUT:{rut_input}-{calculate_rut_digit(rut_input)}")
优化点说明
- 去掉冗余转换:原代码中把反转字符串转列表、把数字串拆成列表再转整数的操作都是多余的,直接遍历字符串或用
zip配对即可完成计算。 - 简化分支判断:用链式三元表达式替代多分支
if-elif,代码更紧凑易读。 - 内存优化:用生成器表达式替代列表推导,避免生成中间列表占用内存。
- 扩展性提升:第二种方式用
itertools.cycle实现权重循环,天然支持任意长度的RUT数字,比固定长度权重序列更灵活。
测试输入12345678时,优化后的代码同样会输出12345678-5,结果与原代码完全一致。
内容的提问来源于stack exchange,提问作者NiKiuS
相关产品推荐
相关产品推荐

