有没有更好的方法来计算智利 RUT 验证位?

Is there a better way to calculate Chilean RUT verification digit?

提问人:NiKiuS 提问时间:10/2/2023 最后编辑:NiKiuS 更新时间:10/2/2023 访问量:43

问:

对于那些不知道的人,智利 RUT 是居民的 ID,类似于 USCIS#,由 7-8 个数字后跟一个验证位组成(通过一种 MOD11 检查计算)。

我制作了下一个 python 代码来使用 python 列表获取该数字,但我需要询问是否有更好、最新、更智能或更短的方法来获取它。

使用的 MOD11 算法:

  1. 8 位数字的 ID 号
  2. 反转它
  3. 将每个数字乘以 2,3,4,5,6,7,2,3(我使用 10 长度的数字来尝试更大的数字)
  4. 将乘以的值相加并计算模量(%)除以 11
  5. 验证数字为 11 - 模数
  6. 如果数字为 10,则显示“K”,如果数字为 11,则显示“0”。

法典:

# Function to calculate digit using python lists
def DIG(RUT):
    RUTrev=list(reversed(RUT))
    CAD10=list(str(2345672345))
    calc = list(int(RUTrev[i]) * int(CAD10[i]) for i in range(len(RUT)))
    digit = 11-sum(calc)%11
    if digit==10:
        digit="K"
    elif digit==11:
        digit=0
    else:
        digit=digit
    return digit

# Using the function to show the entire ID
RUT=input("Insert RUT number:/n")
print(f"RUT with digit is: {RUT}-{DIG(RUT)}")

输出:

Insert RUT number:
12345678
RUT with digit is: 12345678-5
Python 验证 位数

评论


答:

1赞 CtrlZ 10/2/2023 #1

首先,应使函数的返回类型保持一致。

您可以使用 map() 轻松枚举输入值 (RUT)

像这样的东西:

def checkDigit(rut):
    m = 2
    _sum = 0
    for d in map(int, reversed(rut)):
        _sum += m * d
        m = 2 if m == 7 else m + 1
    if (r := 11 - (_sum % 11)) == 10:
        return 'K'
    return '0' if r == 11 else str(r)

RUT = '12345678'

print(f'{RUT}-{checkDigit(RUT)}')

输出:

12345678-5