You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

是否有更优的智利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)}")

优化点说明

  1. 去掉冗余转换:原代码中把反转字符串转列表、把数字串拆成列表再转整数的操作都是多余的,直接遍历字符串或用zip配对即可完成计算。
  2. 简化分支判断:用链式三元表达式替代多分支if-elif,代码更紧凑易读。
  3. 内存优化:用生成器表达式替代列表推导,避免生成中间列表占用内存。
  4. 扩展性提升:第二种方式用itertools.cycle实现权重循环,天然支持任意长度的RUT数字,比固定长度权重序列更灵活。

测试输入12345678时,优化后的代码同样会输出12345678-5,结果与原代码完全一致。

内容的提问来源于stack exchange,提问作者NiKiuS

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 19:32:15