【问题标题】:Python algorithm for Credit Card fraud信用卡欺诈的 Python 算法
【发布时间】:2020-10-11 02:53:43
【问题描述】:

提示: 根据一些简单的算法,实现一个判断卡号是否有效的函数。假设信用卡号是一个由14个字符组成的字符串,格式为####-####-####,包括破折号,其中‘#’代表一个数字 0-9 之间,所以总共有 12 位数字。

目标:实现一个名为“verify”的函数,它接受一个参数 称为“数字”,然后检查以下规则:

  1. 第一个数字必须是 4。
  2. 第四位必须比第五位大一;请记住,这些 由于格式为####-####-####,因此用破折号分隔。
  3. 所有数字之和必须能被 4 整除。
  4. 如果您将前两位视为两位数,第七位和第八位 两位数的数字,它们的总和必须是 100。

如果条件不满足,则根据失败的规则返回“rule#X”。

我的进步:

def verify(number):
    if len(number) != 14:
        return False
    if number[0] != 4:
        print("rule#1")
    if number[5] + 1 != number[3]:
        print("rule#2")
    if sum(number) != int:
        print("rule#3")
    if number[0,1] + number[6,7] != 100
        print("rule#4")

    return True # 

input = "5000-0000-0000" 
output = verify(input) 
print(output) 

我认为我在第三种和第四种情况下遇到困难,但不知道该怎么做/如何处理它。

【问题讨论】:

  • 您不想打印字符串,而是想return "rule#1" 等。仅供参考
  • 您能否提供更多输入值和相应预期输出的示例?
  • 您首先要处理的是number 是一个字符串,而不是一个数字,因此您需要将相关部分转换为整数才能对它们进行求和。索引到字符串的正确方法是number[0:1],而不是number[0,1]
  • 要获得总和,您可以使用它; sum(map(int, '1234-5678-9012'.replace('-', '')))
  • 这能回答你的问题吗? Python Credit Card Validation

标签: python conditional-statements credit-card


【解决方案1】:

您应该return 字符串而不是打印。对于第三条规则,您可以使用模 % 函数。这是一种方法(几乎可以肯定第四条规则可以改进......)

def verify(number):
    if len(number) != 14 or int(number[0]) != 4:
        return False
    if int(number[0]) != 4:
        return "rule#1"
    if int(number[5]) + 1 != int(number[3]):
        return "rule#2"
    if sum(int(num) for num in number.replace("-","")) % 4 != 0:
        return "rule#3"
    if int(str(number[0] + str(number[1]))) + int(str(number[6] + str(number[7]))) != 100:
        return "rule#4"
    return True

input = "4501-0550-0000"
output = verify(input)
print(output)

【讨论】:

    【解决方案2】:

    你可以试试这个:

    import re
    def verify(number):
        try:
            ## remove any spaces in begginng and end
            number = number.strip()
            ## remove any spaces between numbers
            number = re.sub("\s+","",number)
            if len(number) != 14:
                return False, "current number length is "+str(len(number)) + " but number is missing the expected length of 14."
            if int(number[0]) != 4:
                return False, "First digit must be 4. but received first digit is " + number[0]
            if int(number[5]) + 1 != int(number[3]):
                 return False, "The fourth digit must be one greater than the fifth digit"
            if sum([int(digit) for digit in re.sub("-","",input)]) % 4 != 0:
                return False, "Sum of all digit is not divisible by 4"
            if int(input[0:2]) +  int(input[-2:]) != 100:
                return False, "Sum of first two digit and last two digit is not 100"
            return True, "All conditions are met"
        except Exception as e:
            print(e)
            return False, "code got interrupted."
        
    input = "4000-0000-0010" 
    output = verify(input) 
    print(output) 
    

    您可以通过output[0] 访问输出以获取真/假,output[1] 获取消息

    【讨论】:

      【解决方案3】:

      对于第三条规则,您可以这样做。删除“-”字符并添加所有数字。

      strippedNum=number.replace('-','')  # remove '-'
      digits_sum = sum([int(digit) for digit in strippedNum]) # make a list with all the digits and find their sum
      if sum_of_all % 4 != 0:
          print(rule#3)
      

      第四个你可能会得到一个错误,因为你试图连接两个字符串并将它等同于一个整数。这应该是这样的,

        if int(number[0:1]) + int(number[6:7]) != 100 # Use [lower_limit:upper_limit] when extracting from a list
          print("rule#4")
      

      这就是你最终代码的样子(处理字符串和整数时要小心)

      def verify(number):
          valid = True
          if len(number) != 14:
              valid = False
      if number[0] != '4':    # number[0] is a string
          print("rule#1")
          valid = False
      
      
      if number[5] < number[3]:
          print("rule#2")
          valid = False
      
      
      strippedNum=number.replace('-','')  # remove '-'
      digits_sum = sum([int(digit) for digit in strippedNum]) # make a list with all the digits and find their sum
      print(digits_sum)
      if digits_sum % 4 != 0:
          print("rule#3")
          valid = False
      
      
      if int(number[0:1]) + int(number[6:7]) != 100:
          print("rule#4")
          valid = False
      
      
      return valid 
      
      input = "5000-0000-0000" 
      output = verify(input) 
      print(output)
      

      此方法一次打印所有故障并给出布尔输出。

      【讨论】:

        猜你喜欢
        • 2019-10-24
        • 2020-07-18
        • 2019-02-25
        • 2010-11-10
        • 2012-02-12
        • 2013-01-14
        • 2015-02-21
        • 2019-10-27
        • 2018-12-21
        相关资源
        最近更新 更多