Kei Minagawa's Blog

皆川圭(@keimina)のブログ、Pythonで試したことを書いていきます

エクセルのアルファベットの列番号を数値に変換するPythonプログラム

昼休みの暇つぶしに書いたコードを載せます。
エクセルのアルファベットの列番号を数値に変換する簡単なPythonプログラムになります。

例:
"A"は1
"Z"は26
"AA"は27

アルファベットを数値に変換し、各桁の重みをかけて右から左へ順に足しこんで行くプログラムです。
以下にアルファベットを数値に変換する関数conv(alphabet)とその関数のテストプログラムを示します。

inps = ['A', 'Z', 'AA', 'AZ', 'ZZ']
out_expects = [1, 26, 26+1, 26+26, 26*26+26]

def conv(alphabet):
	total = 0
	for n, i in enumerate(alphabet[::-1]):
		chr_num = ord(i.lower())
		chr_A_num = ord('a')
		total +=  (1 + chr_num - chr_A_num)* (26**n)
	return total
		
def test(inps, out_expects):
	for alphabet, out_expect in zip(inps, out_expects):
		out = conv(alphabet)
		print('input:%s, output:%s, out expect:%s'%(alphabet, str(out), str(out_expect)))
		print('%s' %('OK' if out==out_expect else 'NG'))
		
test(inps, out_expects)

テスト結果

input:A, output:1, out expect:1
OK
input:Z, output:26, out expect:26
OK
input:AA, output:27, out expect:27
OK
input:AZ, output:52, out expect:52
OK
input:ZZ, output:702, out expect:702
OK

昆布関数conv(alphabet)がアルファベットを数値に変換します。
出力結果の期待値については以下のように考えるとわかりやすいと思います。

'A'は1
'AA'は26+1
'AZ'は26+26
'BA'は26*2 + 1
'BZ'は26*2 + 26
、、、
'ZZ'は26*26+26

もちろん「conv(alphabet) - 1」とすれば0から始まるインデックスとして使うこともできます。
2進数変換はよく聞くけどこの形の変換は聞いたことがないです。
この形式の数はなんというのでしょうかね?16進数のように数値とアルファベットが混ざっているわけではないのでN進数という言葉ではない気がします。知っている人が入ればコメントください。


以上