欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

使用 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

【测试样例】
在这里插入图片描述