ISBN番号のチェックディジットを計算するプログラムを書いています。ユーザーの入力(ISBNの9桁)を整数変数に読み取り、最後の桁に2を掛け、最後の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
または、ユーザーの入力を整数に変換しないでください(ユーザーは文字列を入力します)
isbn = raw_input()
for pos, ch in enumerate(reversed(isbn)):
print "%d * %d is %d" % pos + 2, int(ch), int(ch) * (pos + 2)
詳細については、 チュートリアル を参照してください。
while number:
digit = number % 10
# do whatever with digit
# remove last digit from number (as integer)
number //= 10
ループの各反復で、numberから最後の桁を削除し、digit
に割り当てます。それは逆で、最後の数字から始まり、最初の数字で終わります
list_of_ints = [int(i) for i in str(ISBN)]
Intの順序付きリストを提供します。もちろん、アヒルのタイピングを考えると、str(ISBN)を使用することもできます。
編集:コメントで述べたように、このリストは昇順または降順という意味ではソートされていませんが、定義された順序(理論的にはpythonのセット、辞書などはありませんが、順序はかなり信頼できる傾向があります)。並べ替える場合:
list_of_ints.sort()
あなたの友達です。 sort()はその場でソートし(実際のように、既存のリストの順序を実際に変更する)、新しいリストを返さないことに注意してください。
古いバージョンのPython ...
map(int,str(123))
新しいバージョン3kで
list(map(int,str(123)))
(number/10**x)%10
これをループで使用できます。ここで、numberは完全な数、xはループの各反復(0、1、2、3、...、n)で、nは停止点です。 x = 0は1の場所、x = 1は10の場所、x = 2は100の場所、というようになります。これにより、数字の値が右から左に渡されるため、ISBNには当てはまらない可能性がありますが、それでも各数字は分離されます。
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)
再帰バージョン:
def int_digits(n):
return [n] if n<10 else int_digits(n/10)+[n%10]
それを文字列に変換し、int()関数でマッピングします。
map(int, str(1231231231))
このループの本体を使用して、数字で何でもしたい
for digit in map(int, str(my_number)):
this answerに似ていますが、デジを反復するより「Python的な」方法は次のとおりです。
while number:
# "pop" the rightmost digit
number, digit = divmod(number, 10)
私はこのプログラムを作成しましたが、ここに私のプログラムでチェックディジットを実際に計算するコードの一部があります
#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]))
お役に立てれば :)
整数xからi-ththest Significant Digitを取得したい場合は、次を試してください:
(abs(x)%(10**i))/(10**(i-1))
役に立てば幸いです。
よく調べた結果、いくつかのソリューションが見つかりましたが、それぞれに長所と短所があります。タスクに最適なものを使用してください。
すべての例は、オペレーティングシステム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)
_
回答: 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)
1桁の数字のリストはどうですか...
ldigits = lambda n, l=[]: not n and l or l.insert(0,n%10) or ldigits(n/10,l)