56

ISBN 番号のチェック ディジットを計算するプログラムを作成しています。ユーザーの入力 (ISBN の 9 桁) を整数変数に読み取ってから、最後の桁に 2 を掛け、最後から 2 番目の桁に 3 を掛ける必要があります。これを行うには、どうすれば整数を構成数字に「分割」できますか? これは基本的な宿題の演習なので、リストを使用することは想定されていません。

4

15 に答える 15

88

そこから文字列を作成するだけです。

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)

詳細については、チュートリアルを参照してください。

于 2009-06-10T11:11:07.597 に答える
77
while number:
    digit = number % 10

    # do whatever with digit

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

ループの反復ごとに、 number から最後の桁を削除し、 に割り当てdigitます。逆です、下一桁から始めて一桁で終わります

于 2009-06-10T11:30:36.293 に答える
23
list_of_ints = [int(i) for i in str(ISBN)]

int の順序付きリストが表示されます。もちろん、ダックタイピングを考えると、str(ISBN) を使用することもできます。

編集:コメントで述べたように、このリストは昇順または降順という意味でソートされていませんが、定義された順序があります(理論的にはpythonのセット、辞書などはそうではありませんが、実際には順序は傾向がありますかなり信頼できる)。並べ替えたい場合:

list_of_ints.sort()

あなたの友達です。sort() はその場でソートし (既存のリストの順序を実際に変更します)、新しいリストを返さないことに注意してください。

于 2009-06-10T11:12:53.707 に答える
14

古いバージョンの Python では...

map(int,str(123))

新しいバージョン 3k について

list(map(int,str(123)))
于 2010-09-14T06:07:16.540 に答える
4
(number/10**x)%10

これをループで使用できます。number は完全な数、x はループの各反復 (0、1、2、3、...、n) で、n は停止点です。x = 0 は 1 の位、x = 1 は 10 の位、x = 2 は 100 の位などを示します。これは右から左に数字の値を与えることに注意してください。したがって、これは ISBN の場合ではないかもしれませんが、それでも各数字は分離されます。

于 2014-04-09T13:24:56.010 に答える
2

再帰バージョン:

def int_digits(n):
    return [n] if n<10 else int_digits(n/10)+[n%10]
于 2012-09-15T08:38:56.707 に答える
2

文字列に変換し、int() 関数でマップします。

map(int, str(1231231231))
于 2011-10-16T22:19:24.933 に答える
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)
于 2013-07-03T21:33:35.830 に答える
1

このループの本体を使用して、数字でやりたいことを何でもします

for digit in map(int, str(my_number)):
于 2014-01-13T21:51:31.560 に答える
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))

長いコード行ですが、1 行のコードで、数値を分割し、数字に適切な量を掛けて、それらを足し合わせて、11 で割ります。.split() 関数はリストを作成するだけなので (小数で分割されます)、リストの 2 番目の項目を取得し、11 から取得してチェック ディジットを見つけることができます。これは、次の 2 行を変更することでさらに効率的にすることもできます。

    remainder = no11[1]
    no11 = (11 - int(remainder))

これに:

    no11 = (11 - int(no11[1]))

お役に立てれば :)

于 2014-01-16T09:48:27.287 に答える
0

数字のワンライナーリストはどうですか...

ldigits = lambda n, l=[]: not n and l or l.insert(0,n%10) or ldigits(n/10,l)
于 2010-09-14T05:20:40.703 に答える
0

整数xからi番目の最下位桁を取得したいと仮定すると、次のように試すことができます。

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

お役に立てば幸いです。

于 2015-09-16T19:09:35.330 に答える
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)
于 2015-09-14T14:32:51.410 に答える