我需要创建一个函数,该函数采用13位数字的序列,并使用模数10来使用最后一个数字作为校验。即BAF189D234EA2入口校验= 2。
使用A-F的值(请参见下面的重量字典)代替ord(char)。因此,当我的循环迭代时,如果它是字符串值,我需要char来拉出相应的weight dict。我根本无法弄清楚如何根据char的值从该字典中调用它。
在此先感谢您的帮助。
weight={
'A' : '10',
'B' : '11',
'C' : '12',
'D' : '13',
'E' : '14',
'F' : '15',
}
def validater(value):
global userEntry
valSum = 0
i = 0
for char in userEntry:
if i == 12:
break
try:
if char >=0 and char <= 9:
valSum += char * i
i +=1
except TypeError:
valSum += weight[char] * i
i += 1
错误:
Traceback (most recent call last):
line 93, in <module>
if validater(userEntry) ==True:
line 74, in validater
valSum += weight[char] * i
TypeError: unsupported operand type(s) for +=: 'int' and 'str'
编辑: 谢谢,我通过删除整数前后的引号来更改字典。现在我得到一个关键错误1
答案 0 :(得分:2)
简短版本:
>>> is_ok = lambda x: sum(i * int(c, 16) for i, c in enumerate(x[:-1])) % 10 == int(x[-1], 16)
>>> is_ok('BAF189D234EA2')
True
>>> is_ok('BAF189D234EA3')
False
使用内置int()
时,您可以指定一个底数。查看this answer,您可以直接转换字符。
>>> int('a', 16)
10
>>> int('1a', 16)
26
因此,请尝试以下代码:
def validate(value):
assert len(value) == 13
value_sum = sum(
int(c, 16) * i
for i, c in enumerate(value[:-1]))
last_digit = int(value[-1], 16)
assert value_sum % 10 == last_digit
在对您的示例进行测试时,我得到了正确的结果:
>>> validate('BAF189D234EA2')
当我更改一个字符时,它失败并出现断言错误:
>>> validate('BAF189D234EA3')
Traceback (most recent call last):
File "<input>", line 1, in <module>
File "<input>", line 10, in validate
AssertionError
输入不超过13个字符时也会引发错误
>>> validate('BAF189D234EA23')
Traceback (most recent call last):
File "<input>", line 1, in <module>
File "<input>", line 2, in validate
AssertionError
答案 1 :(得分:2)
您的错误是由于您的字典值都是字符串而不是整数,所以将它们更改为整数将解决您的问题,但是由于您所映射的都是十六进制数到10的底数,因此您也可以只进行转换你自己
valSum += int(char, 16) * i
答案 2 :(得分:0)
1)从重量中删除报价
2)在尝试
之后立即将char转换为int3)除法(模)的余数为%btw