Разбить целое число на цифры, чтобы вычислить контрольную сумму ISBN - PullRequest
50 голосов
/ 10 июня 2009

Я пишу программу, которая вычисляет контрольную цифру номера ISBN. Я должен прочитать ввод пользователя (девять цифр ISBN) в целочисленную переменную, а затем умножить последнюю цифру на 2, вторую последнюю цифру на 3 и так далее. Как я могу «разделить» целое число на составляющие его цифры, чтобы сделать это? Поскольку это базовое домашнее задание, я не должен использовать список.

Ответы [ 15 ]

81 голосов
/ 10 июня 2009

Просто создайте из него строку.

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)

Для получения дополнительной информации прочитайте учебник .

66 голосов
/ 10 июня 2009
while number:
    digit = number % 10

    # do whatever with digit

    # remove last digit from number (as integer)
    number //= 10

На каждой итерации цикла она удаляет последнюю цифру из числа, присваивая ее digit. Все наоборот, начинается с последней цифры, заканчивается первой

20 голосов
/ 10 июня 2009
list_of_ints = [int(i) for i in str(ISBN)]

Даст вам упорядоченный список целых. Конечно, учитывая типизацию утки, вы также можете работать с str (ISBN).

Редактировать: Как уже упоминалось в комментариях, этот список не отсортирован в смысле восходящего или нисходящего, но он имеет определенный порядок (наборы, словари и т. Д. В Python в теории не, хотя на практике заказ имеет тенденцию быть довольно надежным). Если вы хотите отсортировать это:

list_of_ints.sort ()

твой друг. Обратите внимание, что sort () сортирует на месте (как, фактически, изменяет порядок существующего списка) и не возвращает новый список.

13 голосов
/ 14 сентября 2010

В старых версиях Python ...

map(int,str(123))

В новой версии 3k

list(map(int,str(123)))
3 голосов
/ 09 апреля 2014
(number/10**x)%10

Вы можете использовать это в цикле, где число - это полное число, x - это каждая итерация цикла (0,1,2,3, ..., n), где n - точка остановки. x = 0 дает одно место, x = 1 дает десятки, x = 2 дает сотни и так далее. Имейте в виду, что это даст значение цифр справа налево, поэтому это может быть не для номера ISBN, но все равно будет изолировать каждую цифру.

2 голосов
/ 04 июля 2013

Преобразование в 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)
2 голосов
/ 15 сентября 2012

Версия рекурсии:

def int_digits(n):
    return [n] if n<10 else int_digits(n/10)+[n%10]
2 голосов
/ 17 октября 2011

Преобразуйте его в строку и отобразите его с помощью функции int ().

map(int, str(1231231231))
1 голос
/ 09 мая 2015

Похоже на этот ответ, но более "питонический" способ перебора цифр будет:

while number:
    # "pop" the rightmost digit
    number, digit = divmod(number, 10)
1 голос
/ 16 января 2014

Я сделал эту программу, и вот фрагмент кода, который фактически вычисляет контрольную цифру в моей программе

    #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]))

Надеюсь, это поможет:)

...