我正在编写一个计算ISBN号校验位的程序。我必须将用户的输入(ISBN的九位数)读入整数变量,然后将最后一位数乘以2,将倒数第二位乘以3,依此类推。如何将整数“拆分”为其组成数字来执行此操作?由于这是一项基本的家庭作业,我不应该使用清单。
答案 0 :(得分:81)
只需从中创建一个字符串。
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
或者更好的是,不要将用户的输入转换为整数(用户键入字符串)
isbn = raw_input()
for pos, ch in enumerate(reversed(isbn)):
print "%d * %d is %d" % pos + 2, int(ch), int(ch) * (pos + 2)
有关详细信息,请阅读tutorial。
答案 1 :(得分:66)
while number:
digit = number % 10
# do whatever with digit
# remove last digit from number (as integer)
number //= 10
在循环的每次迭代中,它从数字中删除最后一位数字,并将其分配给digit
。
它是相反的,从最后一位开始,以第一位完成
答案 2 :(得分:20)
list_of_ints = [int(i) for i in str(ISBN)]
会给你一份有序的整体清单。当然,给鸭子打字,你也可以使用str(ISBN)。
编辑:正如评论中所提到的,这个列表没有按升序或降序排序,但它确实有一个已定义的顺序(理论上没有python中的集合,字典等,尽管在实践中订单往往相当可靠)。如果你想对它进行排序:
list_of_ints.sort()
是你的朋友。请注意,sort()就地排序(如实际更改现有列表的顺序)并且不返回新列表。
答案 3 :(得分:13)
旧版本的Python ...
map(int,str(123))
新版本3k
list(map(int,str(123)))
答案 4 :(得分:3)
(number/10**x)%10
你可以在循环中使用它,其中number是全数,x是循环的每次迭代(0,1,2,3,...,n),其中n是停止点。 x = 0给出那些位置,x = 1给出十位,x = 2给出数百,依此类推。请记住,这将从右到左给出数字的值,因此这可能不是ISBN的数字,但它仍然会隔离每个数字。
答案 5 :(得分:2)
将其转换为字符串并使用int()函数映射它。
map(int, str(1231231231))
答案 6 :(得分:2)
转换为str
肯定比慢除以10更慢。
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)
答案 7 :(得分:1)
使用此循环体可以使用数字
执行任何操作for digit in map(int, str(my_number)):
答案 8 :(得分:1)
我制作了这个程序,这里有一些实际计算程序中校验位的代码
#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]))
希望这会有所帮助:)
答案 9 :(得分:1)
类似于this答案,但更多的是&#34; pythonic&#34;迭代digis的方法是:
while number:
# "pop" the rightmost digit
number, digit = divmod(number, 10)
答案 10 :(得分:0)
如何使用单行数字列表......
ldigits = lambda n, l=[]: not n and l or l.insert(0,n%10) or ldigits(n/10,l)
答案 11 :(得分:0)
答案: 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)
答案 12 :(得分:0)
假设您想从整数 x 中获取 i - 最低有效数字,您可以尝试:
(abs(x)%(10**i))/(10**(i-1))
我希望它有所帮助。
答案 13 :(得分:0)
经过自己的努力搜索,我找到了几种解决方案,每种解决方案都有优点和缺点。使用最适合您的任务。
在操作系统GNU / Linux Debian 8上使用CPython 3.5测试的所有示例。
使用递归
代码
def get_digits_from_left_to_right(number, lst=None):
"""Return digits of an integer excluding the sign."""
if lst is None:
lst = list()
number = abs(number)
if number < 10:
lst.append(number)
return tuple(lst)
get_digits_from_left_to_right(number // 10, lst)
lst.append(number % 10)
return tuple(lst)
演示
In [121]: get_digits_from_left_to_right(-64517643246567536423)
Out[121]: (6, 4, 5, 1, 7, 6, 4, 3, 2, 4, 6, 5, 6, 7, 5, 3, 6, 4, 2, 3)
In [122]: get_digits_from_left_to_right(0)
Out[122]: (0,)
In [123]: get_digits_from_left_to_right(123012312312321312312312)
Out[123]: (1, 2, 3, 0, 1, 2, 3, 1, 2, 3, 1, 2, 3, 2, 1, 3, 1, 2, 3, 1, 2, 3, 1, 2)
使用功能divmod
代码
def get_digits_from_right_to_left(number):
"""Return digits of an integer excluding the sign."""
number = abs(number)
if number < 10:
return (number, )
lst = list()
while number:
number, digit = divmod(number, 10)
lst.insert(0, digit)
return tuple(lst)
演示
In [125]: get_digits_from_right_to_left(-3245214012321021213)
Out[125]: (3, 2, 4, 5, 2, 1, 4, 0, 1, 2, 3, 2, 1, 0, 2, 1, 2, 1, 3)
In [126]: get_digits_from_right_to_left(0)
Out[126]: (0,)
In [127]: get_digits_from_right_to_left(9999999999999999)
Out[127]: (9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9)
使用构造tuple(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,)
使用功能re.findall
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,)
使用模块decimal
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)