週末副業記

土日は副業エンジニアのブログです。副業に関することを投稿します。

文字列を、指定された基数で10進数に変換[Python3.0]


基数変換

 f:id:aisakakun:20160220124428j:plain

 "AF"という文字列が与えられ、もう一つ引数として、

"16"が与えられたとすると、これを10進数に変換すると"175"ですよね。

10*16^1+15*16^0 = 175

 こういった感じでランダムな基数(先ほどの場合は基数は"16")が与えられ、

その基数で表されている文字列をその基数に則って10進数に変換するプログラムの作成です。

イメージとしては、上の式で表されていることをそのまま書けばいいので、 

こんな感じにかけました。過去に用いた「enumerate」、「all( )」がいきました。

(参照:enumerate→転倒数を数える。[Python 3.0] - aisaka.com

            all →パングラムであるかどうかを確かめる。[Python 3.0] - aisaka.com

 

def checkio(str_number, radix):
    digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"[:radix]
    if all( check in digits for check in str_number) == True:
        return sum(digits.index(value)*radix**n for n,value in enumerate(str_number[::-1]))
    else:
        return -1

 

要素番号ごとループに回して....とそうしたら文字列を逆順にしないとここで掛け合わされている"n"がかみ合いませんよね。

なので、今回初登場の

"str_number[::-1]"

 です。 [ : : -1]の意味を説明します。

文字列の逆順って結構面倒なんですが、これだと一発。

スライス操作の拡張で、元来、[begin:end:step]と指定することになっているので

ここをbeginとendを無視して、stepを-1刻みにすれば、

-1というのは配列の一番後ろを表し、最後列の一個前は-2というようになっているため

うまい具合に逆順にできるというわけです。

 

下記URLに他のExtended-slicesが載っているので参考にしてみてください。

(参照:https://docs.python.org/2/whatsnew/2.3.html#extended-slices