使用 python 列表生成器计算身份证验证码
最编程
2024-05-05 07:27:32
...
问题描述】
按照下面的输入形式,提示用户输入18位身份证号码,
利用列表生成式,分别生成如下四个列表
①由身份证号码左边17位数字构成的列表
②17位数字对应权重构成的列表,提示:最左边数字对应的权重为2**17%11,往右的话,指数17依次递减1
③由数字和对应权重配对构成的列表
④由数字和对应权重相乘后的一组乘积构成的列表
对乘积列表求和,假设和为s,则校验码为(12-s%11)%11,若为10则用字符X表示
【输入形式】
请输入18位身份证号码
【输出形式】
【样例输入】
320213201508271234
【样例输出】
身份证号左边17位数字构成的列表为
[3, 2, 0, 2, 1, 3, 2, 0, 1, 5, 0, 8, 2, 7, 1, 2, 3]
对应的权重列表为
[7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
数字和权重配对组成的列表为
[(3, 7), (2, 9), (0, 10), (2, 5), (1, 8), (3, 4), (2, 2), (0, 1), (1, 6), (5, 3), (0, 7), (8, 9), (2, 10), (7, 5), (1, 8), (2, 4), (3, 2)]
数字和权重对应相乘后组成的列表为
[21, 18, 0, 10, 8, 12, 4, 0, 6, 15, 0, 72, 20, 35, 8, 8, 6]
计算得到的校验码为0
【python代码】
#code 用于存放18位的身份证号,以字符串形式储存
code = input()
s = 0
list1 = list(code[:17])
for i in range(17):
list1[i] = int(list1[i])
list2 = [0 for i in range(17)]
list3 = [0 for i in range(17)]
list4 = [0 for i in range(17)]
#对字符串进行切片操作,分出单个数字并转换为int类型,找出i与切片位置的关系
for i in range(0,17):
m = int(code[17-i-1:17-i])
list2[16-i] = 2**(i+1)%11
list3[16-i] = eval('('+str(m)+','+ str(list2[16-i])+')')
list4[16-i] = m*list2[16-i]
s += list4[16-i]
#变量cd表示校验码
cd = (12-s%11)%11
print("请输入18位身份证号码身份证号左边17位数字构成的列表为")
print(list1)
print("对应的权重列表为")
print(list2)
print("数字和权重配对组成的列表为")
print(list3)
print("数字和权重对应相乘后组成的列表为")
print(list4)
if cd == 10:
print("计算得到的校验码为{}".format('X'))
else:
print("计算得到的校验码为{}".format(cd))
#320213201508271234
【测试样例】