正整数与类Excel字母索引的双向转换方法问询
正整数与Excel式字母索引的双向转换实现
我需要实现一套正整数与类Excel列标签的字母索引双向转换逻辑,用于排序、范围大小计算等场景。这套索引规则是:A=1,B=2……Z=26,AA=27,AB=28……ZZ=702,AAA=703,以此类推。注意这不是普通的十进制转26进制——普通26进制中A代表0,AA等价于0,26会被转换为BA,完全不符合需求。
一、字母索引转正整数
这个逻辑比较直观,遍历字符串的每个字符,按位加权求和即可。每个字符对应数值为ord(c) - ord('A') + 1(A=1,Z=26),每一位的权重是26的幂次,从左到右依次计算:
def letters_to_number(s): num = 0 for c in s.upper(): num = num * 26 + (ord(c) - ord('A') + 1) return num
示例:输入"ABC",计算过程为0*26+1=1 → 1*26+2=28 → 28*26+3=731,返回结果731,对应第731个字母索引。
二、正整数转字母索引(核心实现)
这部分是难点,普通进制转换无法直接套用。我设计了一套处理余数的算法,解决了26对应Z、27对应AA这类特殊情况:
算法思路
- 初始化空列表存储结果字符
- 循环处理输入整数
n,直到n变为0:- 计算
n % 26得到余数 - 若余数为0,说明当前位是Z,将Z加入列表,同时
n = (n // 26) - 1(因为Z占用了26的位置,需要向前借一位) - 若余数不为0,将余数对应的字母(A+余数-1)加入列表,
n = n // 26
- 计算
- 反转列表拼接成字符串,得到最终的字母索引
代码实现
def number_to_letters(n): letters = [] while n > 0: remainder = n % 26 if remainder == 0: letters.append('Z') n = (n // 26) - 1 else: letters.append(chr(ord('A') + remainder - 1)) n = n // 26 return ''.join(reversed(letters))
示例验证:
- 输入731:
731%26=3→加C,n=28;28%26=2→加B,n=1;1%26=1→加A,n=0;反转得到ABC - 输入26:
26%26=0→加Z,n=0;返回Z - 输入27:
27%26=1→加A,n=1;1%26=1→加A,n=0;返回AA
说明
该实现为通用场景设计,逻辑与Excel列名转换一致,但不受限于Excel环境,可直接用于任何需要此类字母索引的系统中。
内容的提问来源于stack exchange,提问作者Ethan Maness
相关产品推荐
相关产品推荐

