在for循环中将字典调用到变量中

时间:2018-10-05 19:25:23

标签: python python-3.x

我需要创建一个函数,该函数采用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

3 个答案:

答案 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转换为int

3)除法(模)的余数为%btw

相关问题