スプレッドシートの列を表すラベルと列数を相互に変換するコードを考える

スプレッドシートの列はA、B、...、Z、AA、...のようなラベルがある。
このA-Z世界は通常のn進数と少し異なる。
通常のn進数でいう0をA-Z世界のAに対応させるとAAは00と書くようなもので、スプレッドシートの列と合わない。
次にAを1に対応させると0の役目がなくなって繰り上がりに不都合が生じる…
思ったより面倒な世界だw
スマートなコードを心がけたが、こんなものだろうか? うーん…
column_labels = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'

def label2num(label):
	label = label.upper()
	s = 0
	for i in range(len(label)): s += ( column_labels.index(label[i]) + 1 ) * len(column_labels) ** ( len(label) - 1 - i )
	return s

def num2label(num):
	s = ''
	while num > 0:
		c = ( num - 1 ) % len(column_labels)
		s = column_labels[c] + s
		num = int( ( num - 1 ) / len(column_labels) )
	return s

if __name__ == '__main__':
	import sys
	label = sys.argv[1]

	if label == '-debug':
		MAX_COUNT = 100000
		print('[INFO] Debug mode is counting up to {}.'.format(MAX_COUNT))
		for num1 in range(1,MAX_COUNT):
			label1 = num2label(num1)
			num2 = label2num(label1)
			label2 = num2label(num2)
			if num1 != num2 or label1 != label2: print(num1, num2, label1, label2)
	else:
		try:
			num = int(label)
			label = num2label(num)
			print(label)
		except:
			num = label2num(label)
			print(num)
2019/12/30 10:07
タグ