题
我正在尝试计算 python 上 ISBN 输入的校验位。到目前为止我已经...
def ISBN():
numlist = []
request = raw_input("Please enter the 10 digit number: ")
if len(request) == 10:
**numlist == request
print numlist**
if len(request) != 10:
print "Invalid Input"
ISBN()
ISBN()
粗体部分是我遇到麻烦的地方,我似乎无法将 10 位数字输入拆分为列表(numlist)中的各个数字,然后将单独的各个数字乘以 11,然后将下一个乘以 10,然后将下一个乘以 9 等等...对于程序的下一部分,我需要将列表中这些新的相乘数字相加,然后我将使用 mod(%) 函数获取余数,然后从 11 中减去该数字,这对我的任何编码都有帮助或关于如何计算 ISBN 的错误陈述将不胜感激。谢谢。
解决方案
这段代码应该可以帮助你:
listofnums = [int(digit) for digit in '1234567890']
multipliers = reversed(range(2,12))
multipliednums = [a*b for a,b in zip(listofnums, multipliers)]
字符串是可迭代的,因此如果迭代它们,每个元素都会作为单字符字符串返回。
int
从(有效)字符串构建 int。
符号 [a*b for a,b in zip(listofnums, multipliers)]
是一个列表理解,一种将序列映射到新列表的便捷语法。
至于其余的,请在您的 repl 中探索它们。注意 reversed
返回一个生成器:如果你想看看里面有什么,你需要使用 tuple
或者 list
来强制其评估。出于显而易见的原因,这对于无限生成器来说可能是危险的。
其他提示
我相信世代是你正在寻找的。
list()
这里是我如何编写代码。我希望我能正确解释代码。
def ISBN():
request = raw_input("Please enter the 10 digit number: ")
if len(request) == 10:
numlist = list(request)
print numlist
else:
print "Invalid Input"
ISBN()
. import itertools
if sum(x * int(d) for x, d in zip(nums, itertools.count(10, -1))) % 11 != 0:
print "no good"
. 不隶属于 StackOverflow