Python 将整数拆分为数字以计算ISBN校验和

Python 将整数拆分为数字以计算ISBN校验和,python,integer,decimal,Python,Integer,Decimal,我正在写一个程序来计算ISBN号码的校验位。我必须将用户的输入(ISBN的九位数字)读入一个整数变量,然后将最后一位数字乘以2,第二位数字乘以3,依此类推。如何将整数“拆分”为其组成数字来执行此操作?由于这是一个基本的家庭作业练习,我不应该使用列表。只需从列表中创建一个字符串即可 myinteger = 212345 number_string = str(myinteger) 够了。现在您可以对其进行迭代: for ch in number_string: print ch # wi

我正在写一个程序来计算ISBN号码的校验位。我必须将用户的输入(ISBN的九位数字)读入一个整数变量,然后将最后一位数字乘以2,第二位数字乘以3,依此类推。如何将整数“拆分”为其组成数字来执行此操作?由于这是一个基本的家庭作业练习,我不应该使用列表。

只需从列表中创建一个字符串即可

myinteger = 212345
number_string = str(myinteger)
够了。现在您可以对其进行迭代:

for ch in number_string:
    print ch # will print each digit in order
或者您可以将其切片:

print number_string[:2] # first two digits
print number_string[-3:] # last three digits
print number_string[3] # forth digit

或者更好,不要将用户的输入转换为整数(用户键入字符串)

有关更多信息,请阅读

将给您一个整数的有序列表。当然,给定duck类型,您也可以使用str(ISBN)

编辑:正如注释中所提到的,这个列表没有按升序或降序排序,但它确实有一个定义的顺序(python中的集合、字典等理论上没有,尽管在实践中顺序往往相当可靠)。如果要对其进行排序:

列表(共个)int.sort()

他是你的朋友。请注意,sort()会就地排序(如中所示,实际上会更改现有列表的顺序),而不会返回新列表

while number:
    digit = number % 10

    # do whatever with digit

    # remove last digit from number (as integer)
    number //= 10
在循环的每次迭代中,它从数字中删除最后一个数字,并将其分配给
数字

相反,从最后一个数字开始,以第一个数字结束,一行数字列表怎么样

ldigits = lambda n, l=[]: not n and l or l.insert(0,n%10) or ldigits(n/10,l)

在Python的旧版本上

map(int,str(123))
关于新版本3k

list(map(int,str(123)))

将其转换为字符串,并使用int()函数映射到该字符串上

map(int, str(1231231231))
递归版本:

def int_digits(n):
    return [n] if n<10 else int_digits(n/10)+[n%10]
def int_位(n):

如果n转换为
str
的速度肯定比除以10慢,则返回[n]

map
比列表理解稍微慢一些:

convert to string with map 2.13599181175
convert to string with list comprehension 1.92812991142
modulo, division, recursive 0.948769807816
modulo, division 0.699964046478
这些时间由我笔记本电脑上的以下代码返回:

foo = """\
def foo(limit):
    return sorted(set(map(sum, map(lambda x: map(int, list(str(x))), map(lambda x: x * 9, range(limit))))))

foo(%i)
"""

bar = """\
def bar(limit):
    return sorted(set([sum([int(i) for i in str(n)]) for n in [k *9 for k in range(limit)]]))

bar(%i)
"""

rac = """\
def digits(n):
    return [n] if n<10 else digits(n / 10)+[n %% 10]

def rabbit(limit):
    return sorted(set([sum(digits(n)) for n in [k *9 for k in range(limit)]]))

rabbit(%i)
"""

rab = """\
def sum_digits(number):
  result = 0
  while number:
    digit = number %% 10
    result += digit
    number /= 10
  return result

def rabbit(limit):
    return sorted(set([sum_digits(n) for n in [k *9 for k in range(limit)]]))

rabbit(%i)
"""


import timeit

print "convert to string with map", timeit.timeit(foo % 100, number=10000)
print "convert to string with list comprehension", timeit.timeit(bar % 100, number=10000)
print "modulo, division, recursive", timeit.timeit(rac % 100, number=10000)
print "modulo, division", timeit.timeit(rab % 100, number=10000)
foo=”“”\
def foo(限制):
返回排序(set(map(sum,map(lambda x:map(int,list(str(x))))))),map(lambda x:x*9,range(limit(limit)())))))
foo(%i)
"""
bar=”“”\
def bar(限制):
返回排序(设置([sum([int(i)for i in str(n)])for n in[k*9 for k in range(limit)]))
酒吧(%i)
"""
rac=”“”\
def数字(n):

如果n返回[n],则使用此循环的主体对数字执行任何操作

for digit in map(int, str(my_number)):

我已经做了这个程序,这是一段代码,它实际计算了我程序中的校验位

    #Get the 10 digit number
    number=input("Please enter ISBN number: ")

    #Explained below
    no11 = (((int(number[0])*11) + (int(number[1])*10) + (int(number[2])*9) + (int(number[3])*8) 
           + (int(number[4])*7) + (int(number[5])*6) + (int(number[6])*5) + (int(number[7])*4) +
           (int(number[8])*3) + (int(number[9])*2))/11)

    #Round to 1 dp
    no11 = round(no11, 1)

    #explained below
    no11 = str(no11).split(".")

    #get the remainder and check digit
    remainder = no11[1]
    no11 = (11 - int(remainder))

    #Calculate 11 digit ISBN
    print("Correct ISBN number is " + number + str(no11))
这是一行很长的代码,但是它将数字拆分,将数字乘以适当的数量,将它们相加,然后除以11,在一行代码中。split()函数只创建一个列表(在小数点处拆分)因此,您可以选择列表中的第二项,然后从11中选择第二项来查找校验位。通过更改这两行,也可以提高效率:

    remainder = no11[1]
    no11 = (11 - int(remainder))
为此:

    no11 = (11 - int(no11[1]))
希望这有帮助:)

您可以在循环中使用它,其中number是完整的数字,x是循环的每个迭代(0,1,2,3,…,n)n是停止点。x=0表示1的位置,x=1表示十,x=2表示百,依此类推。请记住,这将给出从右到左的数字值,因此这可能不是ISBN的值,但它仍将隔离每个数字。

与答案类似,但更像是一个“pythonic”“迭代digis的方法是:

while number:
    # "pop" the rightmost digit
    number, digit = divmod(number, 10)

回答:165

方法:蛮力!下面是一小段Python(2.7版)代码,用于计算它们的总数

from math import sqrt, floor
is_ps = lambda x: floor(sqrt(x)) ** 2 == x
count = 0
for n in range(1002, 10000, 3):
    if n % 11 and is_ps(sum(map(int, str(n)))):
        count += 1
        print "#%i: %s" % (count, n)

假设您希望从整数x中获取第i个最低有效位,您可以尝试:

(abs(x)%(10**i))/(10**(i-1))

我希望能有所帮助。

经过自己的努力搜索,我找到了几种解决方案,每种方案都有优点和缺点。使用最适合你的任务

在操作系统GNU/Linux Debian 8上使用CPython 3.5测试的所有示例


使用递归

代码


使用函数
divmod

In [109]: tuple(map(int, str(abs(-123123123))))
Out[109]: (1, 2, 3, 1, 2, 3, 1, 2, 3)

In [110]: tuple(map(int, str(abs(1412421321312))))
Out[110]: (1, 4, 1, 2, 4, 2, 1, 3, 2, 1, 3, 1, 2)

In [111]: tuple(map(int, str(abs(0))))
Out[111]: (0,)
In [112]: tuple(map(int, re.findall(r'\d', str(1321321312))))
Out[112]: (1, 3, 2, 1, 3, 2, 1, 3, 1, 2)

In [113]: tuple(map(int, re.findall(r'\d', str(-1321321312))))
Out[113]: (1, 3, 2, 1, 3, 2, 1, 3, 1, 2)

In [114]: tuple(map(int, re.findall(r'\d', str(0))))
Out[114]: (0,)
In [117]: decimal.Decimal(0).as_tuple().digits
Out[117]: (0,)

In [118]: decimal.Decimal(3441120391321).as_tuple().digits
Out[118]: (3, 4, 4, 1, 1, 2, 0, 3, 9, 1, 3, 2, 1)

In [119]: decimal.Decimal(-3441120391321).as_tuple().digits
Out[119]: (3, 4, 4, 1, 1, 2, 0, 3, 9, 1, 3, 2, 1)
代码


使用构造
元组(map(int),str(abs(number))

In [109]: tuple(map(int, str(abs(-123123123))))
Out[109]: (1, 2, 3, 1, 2, 3, 1, 2, 3)

In [110]: tuple(map(int, str(abs(1412421321312))))
Out[110]: (1, 4, 1, 2, 4, 2, 1, 3, 2, 1, 3, 1, 2)

In [111]: tuple(map(int, str(abs(0))))
Out[111]: (0,)
In [112]: tuple(map(int, re.findall(r'\d', str(1321321312))))
Out[112]: (1, 3, 2, 1, 3, 2, 1, 3, 1, 2)

In [113]: tuple(map(int, re.findall(r'\d', str(-1321321312))))
Out[113]: (1, 3, 2, 1, 3, 2, 1, 3, 1, 2)

In [114]: tuple(map(int, re.findall(r'\d', str(0))))
Out[114]: (0,)
In [117]: decimal.Decimal(0).as_tuple().digits
Out[117]: (0,)

In [118]: decimal.Decimal(3441120391321).as_tuple().digits
Out[118]: (3, 4, 4, 1, 1, 2, 0, 3, 9, 1, 3, 2, 1)

In [119]: decimal.Decimal(-3441120391321).as_tuple().digits
Out[119]: (3, 4, 4, 1, 1, 2, 0, 3, 9, 1, 3, 2, 1)

使用函数
re.findall

In [109]: tuple(map(int, str(abs(-123123123))))
Out[109]: (1, 2, 3, 1, 2, 3, 1, 2, 3)

In [110]: tuple(map(int, str(abs(1412421321312))))
Out[110]: (1, 4, 1, 2, 4, 2, 1, 3, 2, 1, 3, 1, 2)

In [111]: tuple(map(int, str(abs(0))))
Out[111]: (0,)
In [112]: tuple(map(int, re.findall(r'\d', str(1321321312))))
Out[112]: (1, 3, 2, 1, 3, 2, 1, 3, 1, 2)

In [113]: tuple(map(int, re.findall(r'\d', str(-1321321312))))
Out[113]: (1, 3, 2, 1, 3, 2, 1, 3, 1, 2)

In [114]: tuple(map(int, re.findall(r'\d', str(0))))
Out[114]: (0,)
In [117]: decimal.Decimal(0).as_tuple().digits
Out[117]: (0,)

In [118]: decimal.Decimal(3441120391321).as_tuple().digits
Out[118]: (3, 4, 4, 1, 1, 2, 0, 3, 9, 1, 3, 2, 1)

In [119]: decimal.Decimal(-3441120391321).as_tuple().digits
Out[119]: (3, 4, 4, 1, 1, 2, 0, 3, 9, 1, 3, 2, 1)

使用模块
十进制

In [109]: tuple(map(int, str(abs(-123123123))))
Out[109]: (1, 2, 3, 1, 2, 3, 1, 2, 3)

In [110]: tuple(map(int, str(abs(1412421321312))))
Out[110]: (1, 4, 1, 2, 4, 2, 1, 3, 2, 1, 3, 1, 2)

In [111]: tuple(map(int, str(abs(0))))
Out[111]: (0,)
In [112]: tuple(map(int, re.findall(r'\d', str(1321321312))))
Out[112]: (1, 3, 2, 1, 3, 2, 1, 3, 1, 2)

In [113]: tuple(map(int, re.findall(r'\d', str(-1321321312))))
Out[113]: (1, 3, 2, 1, 3, 2, 1, 3, 1, 2)

In [114]: tuple(map(int, re.findall(r'\d', str(0))))
Out[114]: (0,)
In [117]: decimal.Decimal(0).as_tuple().digits
Out[117]: (0,)

In [118]: decimal.Decimal(3441120391321).as_tuple().digits
Out[118]: (3, 4, 4, 1, 1, 2, 0, 3, 9, 1, 3, 2, 1)

In [119]: decimal.Decimal(-3441120391321).as_tuple().digits
Out[119]: (3, 4, 4, 1, 1, 2, 0, 3, 9, 1, 3, 2, 1)

或者:list of int=map(int,str(ISBN))耶,paffnucy!别忘了map/reduce/zip等!“已排序的int列表”?在什么意义上它将被“排序”?@Daren-不总是更快,但通常更可读(不包括reduce()^^)排序的意义是它有一个定义的顺序,而不是说一个元组或一个集合。我将把它编辑到答案中…我添加了一个解释。如果你看不到它是如何工作的,拿一张纸,一步一步地进行选择。它从给定的数字中提取数字,假设基数为10,从最小的sig开始非常重要的数字。这是一种数学方法,而不是python方法。一种适用于任何语言的方法。当人们对写在另一个基数中的数字感兴趣时,这种方法也会起作用(与此处发布的其他解决方案不同)。因此:+1。为什么不使用生成器?产生
数字
+1,因为这实际上比转换为string快2-3倍。我不敢相信人们看不出这个解决方案有多实用。使用
/
进行整数除法…在Py3k上
/
返回一个浮点。@st0le:我不使用p3k,不使用numpy&不使用psyco=p3k真糟糕。@Lord British,hard也就是说,由于两者都是为不同的版本设计的,我想Py3k应该更快(希望是,呵呵)这太好了。谢谢!@nosklo不幸的是教程Url被破坏了。你介意编辑吗?当你打印数字时,你会在开始时得到一个额外的1,我如何解决这个问题?