秋风祭 发表于 2020-11-23 17:06:56

车架号校验规则实现

# 车架号校验函数
VIN = input("请输入车架号")
vin = str.lower(VIN)#转化为小写
letter = "0123456789abcdefghijklmnopqrstuvwxyz"#字母数字集合
dict1 = dict({'a':1,'b':2,'c':3,'d':4,'e':5,'f':6,'g':7,'h':8,'j':1,'k':2,'l':3,'m':4,'n':5,'p':7,'r':9,'s':2,'t':3,'u':4,'v':5,'w':6,'x':7,'y':8,'z':9,'0':0,'1':1,'2':2,'3':3,'4':4,'5':5,'6':6,'7':7,'8':8,'9':9})

while True:
    count1 = 0#辅助判断
    weighted = 0 #加权
    check = 0 #校验码
# 以下部分判断是否全部为数字字母
    for each in vin:
      if each in letter:#用in判断是否包含在字母数字集合内
            count1 = count1 + 1
      else:
            count1 = count1 + 0

    if len(vin) != 17 :
      print("车架号不为17位")
    elif count1 != 17 :
      print("车架号只能为数字与字母的组合")
    elif "o"in vin or "i"in vin or "q"in vin:
      print("车架号不应该存在O、I、Q字母")
    else:
      for (y1,y2) in zip(vin,):#两个参数的for 应该用zip实现
            weighted = weighted + dict1.get(y1)*y2 #get方法获取dict对应的value
      check = weighted % 11 # 用%获取余数
      if (check == int(vin)) or ((check == 10) and (vin == "x")):#vin切片为str类型,需要转化为int,注意用括号隔开判断条件
            print("车架号符合规则,校验通过")
      else:
            print("车架号不符合规则,校验未通过")
    VIN = input("请输入车架号")
    vin = str.lower(VIN)#转化为小写


其实,非常郁闷的事情是.isalnum方法,明明是(判断是否数字和字母的组合),为什么汉字也给我返回一个Ture?

skyrimz 发表于 2020-11-23 20:27:07

汉字会被判定为字母
解决办法:.encode('utf-8').isalnum

秋风祭 发表于 2020-11-24 16:37:23

校验码如果是X将会导致错误,调整一下

# 车架号校验函数
VIN = input("请输入车架号")
vin = str.lower(VIN)#转化为小写
letter = "0123456789abcdefghijklmnopqrstuvwxyz"#字母数字集合
dict1 = dict({'a':1,'b':2,'c':3,'d':4,'e':5,'f':6,'g':7,'h':8,'j':1,'k':2,'l':3,'m':4,'n':5,'p':7,'r':9,'s':2,'t':3,'u':4,'v':5,'w':6,'x':7,'y':8,'z':9,'0':0,'1':1,'2':2,'3':3,'4':4,'5':5,'6':6,'7':7,'8':8,'9':9})
dict2 = dict({'x':10,'0':0,'1':1,'2':2,'3':3,'4':4,'5':5,'6':6,'7':7,'8':8,'9':9})

while True:
    count1 = 0#辅助判断
    weighted = 0 #加权
    check = 0 #校验码
# 以下部分判断是否全部为数字字母
    for each in vin:
      if each in letter:#用in判断是否包含在字母数字集合内
            count1 = count1 + 1
      else:
            count1 = count1 + 0

    if len(vin) != 17 :
      print("车架号不为17位")
    elif count1 != 17 :
      print("车架号只能为数字与字母的组合")
    elif "o"in vin or "i"in vin or "q"in vin:
      print("车架号不应该存在O、I、Q字母")
    else:
      for (y1,y2) in zip(vin,):#两个参数的for 应该用zip实现
            weighted = weighted + dict1.get(y1)*y2 #get方法获取dict对应的value
      check = weighted % 11 # 用%获取余数
      if check == dict2.get(vin): #vin可能是x,使用int会报错,调整为字典方法对比校验码
            print("车架号符合规则,校验通过")
      else:
            print("车架号不符合规则,校验未通过")
    VIN = input("请输入车架号")
    vin = str.lower(VIN)#转化为小写

秋风祭 发表于 2020-11-24 16:56:10

突然想起 vin 如果是错误的车架号 可能不是0-9、x 而是a、b之类的其他字母{:10_266:},再次调整一下

# 车架号校验函数
VIN = input("请输入车架号")
vin = str.lower(VIN)#转化为小写
letter = "0123456789abcdefghijklmnopqrstuvwxyz"#字母数字集合
dict1 = dict({'a':1,'b':2,'c':3,'d':4,'e':5,'f':6,'g':7,'h':8,'j':1,'k':2,'l':3,'m':4,'n':5,'p':7,'r':9,'s':2,'t':3,'u':4,'v':5,'w':6,'x':7,'y':8,'z':9,'0':0,'1':1,'2':2,'3':3,'4':4,'5':5,'6':6,'7':7,'8':8,'9':9})
dict2 = dict({'a':100,'b':100,'c':100,'d':100,'e':100,'f':100,'g':100,'h':100,'j':100,'k':100,'l':100,'m':100,'n':100,'p':100,'r':100,'s':100,'t':100,'u':100,'v':100,'w':100,'x':10,'y':100,'z':100,'0':0,'1':1,'2':2,'3':3,'4':4,'5':5,'6':6,'7':7,'8':8,'9':9})

while True:
    count1 = 0#辅助判断
    weighted = 0 #加权
    check = 0 #校验码
# 以下部分判断是否全部为数字字母
    for each in vin:
      if each in letter:#用in判断是否包含在字母数字集合内
            count1 = count1 + 1
      else:
            count1 = count1 + 0

    if len(vin) != 17 :
      print("车架号不为17位")
    elif count1 != 17 :
      print("车架号只能为数字与字母的组合")
    elif "o"in vin or "i"in vin or "q"in vin:
      print("车架号不应该存在O、I、Q字母")
    else:
      for (y1,y2) in zip(vin,):#两个参数的for 应该用zip实现
            weighted = weighted + dict1.get(y1)*y2 #get方法获取dict对应的value
      check = weighted % 11 # 用%获取余数
      if check == dict2.get(vin): #vin可能是x,使用int会报错,调整为字典方法对比校验码
            print("车架号符合规则,校验通过")
      else:
            print("车架号不符合规则,校验未通过")
    VIN = input("请输入车架号")
    vin = str.lower(VIN)#转化为小写
页: [1]
查看完整版本: 车架号校验规则实现