在 for 循环期间对变量进行字典调用



我需要创建一个函数,该函数采用 13 位序列并使用最后一个数字作为使用模 10 的检查。 即BAF189D234EA2条目检查 = 2。

使用 A-F 的值(请参阅下面的权重字典(而不是 ord(char(。因此,当我的循环迭代时,如果它是一个字符串值,我需要 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

您的错误是由于字典值都是字符串而不是整数,因此将它们更改为整数可以解决您的问题,但是由于您正在映射的只是十六进制数到基数 10,因此您不妨自己进行转换

valSum += int(char, 16) * i

简短版本:

>>> 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()时,可以指定基础。看看这个答案,你可以直接转换你的字符。

>>> 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(在尝试后立即将char转换为int

3(除法(模(的余数是% BTW

最新更新