使用Luhn算法Python验证信用卡号

时间:2016-09-01 12:52:30

标签: python algorithm

我正在尝试用Python实现Luhn算法。这是我的代码

def validate(n):
    if len(str(n)) > 16:
        return False
    else:
        if len(str(n)) % 2 == 0:
            for i in str(n[0::2]):
                digit = int(str(n[i])) * 2
                while digit > 9:
                    digit = sum(map(int, str(digit)))
            dig_sum = sum(map(int, str(n)))
            return True if dig_sum % 10 == 0 else False
        elif len(str(n)) % 2 != 0:
            for i in str(n[1::2]):
                digit = int(str(n[i])) * 2
                while digit > 9:
                    digit = sum(map(int, str(digit)))
            dig_sum = sum(map(int, str(n)))
            return True if dig_sum % 10 == 0 else False

我一直收到错误

TypeError: 'int' object has no attribute '__getitem__

2 个答案:

答案 0 :(得分:1)

没有完整的错误消息很难判断,但很可能是因为您在某些放置索引的位置以及放置字符串转换的地方感到困惑,例如:for i in str(**n[1::2]**)和{{1} }

处理它的一个好方法是创建一个临时变量digit = int(str(**n[i]**)) * 2,并反复使用它而不是str(n)。

答案 1 :(得分:1)

以下是Lunh算法的python实现,用于检测有效的信用卡号。函数将数字作为字符串并返回其是否为有效信用卡。

它基于以下链接中提到的步骤:https://www.codeproject.com/Tips/515367/Validate-credit-card-number-with-Mod-algorithm

步骤1 - 从校验位开始,每隔一位数字的值加倍(从右到左每隔一位数字)

步骤2 - 如果数字加倍会产生两位数字,请将数字相加以得到一位数字。这将产生八个单位数字。

步骤3 - 现在将未加倍的数字添加到奇数位置

步骤4 - 添加此号码中的所有数字

如果最终金额可以被10整除,则信用卡号码有效。如果它不能被10整除,则该数字无效。

def luhn(ccn):
    c = [int(x) for x in ccn[::-2]] 
    u2 = [(2*int(y))//10+(2*int(y))%10 for y in ccn[-2::-2]]
    return sum(c+u2)%10 == 0

#Test
print(luhn("49927398716"))