ISBN 12至13数字

2024-05-29 11:27:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图从一个12位数的ISBN返回ISBN-13校验位,但遇到了一个奇怪的错误。在

以下是我的12位ISBN-978311020318

每个数字交替乘以1或3。在

9*1+7*3+8*1+3*3+1*1+1*3+0*1+2*3+0*1+3*3+1*1+8*3=91

91%10=1

10-1=9,这是我们的ISBN-13校验位。在

这就是我目前所拥有的。。。在

def isbn_check_digit(isbn):
    s = 0
    for i, d in enumerate(isbn):
        if i % 2 == 0:
            s += int(d*1)
        else:
            s += int(d*3)
            print(s)
    return (10 - (s % 10))

print(isbn_check_digit("978311020318"))

输出如下。。。在

^{pr2}$

我把它拆开看看发生了什么

    if i % 2 == 0:
        s += int(d*1)
        print(s)
    else:
        s += 0

9
17
18
18
18
19
1

1的倍数运行良好,但为什么它在3的倍数下表现异常呢?在


Tags: forifdefcheck错误数字elseint
2条回答

因为,在计算表达式int(d * 3)时,d不是一个数字,而是一个由一个字符组成的字符串,它是一个数字。结果,它乘以3将重复这个数字三次:例如,3将变成{},而不是{}。在

在将字符串转换为整数后,您希望乘以3:

int(d) * 3

@dustwuff给出了原因,但另一个修复方法是使用map然后将字符串转换为列表:

from itertools import izip_longest

def grouper(n, iterable, fillvalue=None):
    "grouper(3, 'ABCDEFG', 'x')  > ABC DEF Gxx"
    args = [iter(iterable)] * n
    return izip_longest(fillvalue=fillvalue, *args)

def isbn_check_digit(isbn):
    number = list(map(int, isbn))
    check_sum = 0
    for i, d in grouper(2, number):
        check_sum += i*1 + d*3
    return 10 - check_sum % 10

map将对iterable的每个成员应用函数。在本例中,应用int将把字符串转换成一个数字列表。在

相关问题 更多 >

    热门问题