Python 将整数拆分为数字以计算ISBN校验和
我正在写一个程序来计算ISBN号码的校验位。我必须将用户的输入(ISBN的九位数字)读入一个整数变量,然后将最后一位数字乘以2,第二位数字乘以3,依此类推。如何将整数“拆分”为其组成数字来执行此操作?由于这是一个基本的家庭作业练习,我不应该使用列表。只需从列表中创建一个字符串即可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
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,我如何解决这个问题?