Python实现整数转类Excel列名字符串函数的需求与解决方案
整数转类似Excel列名字符串的Python实现
需求说明
我需要实现一个Python函数,输入整数后返回对应的字符串,映射规则和Excel列名逻辑一致:
- 1 → 'a'
- 26 → 'z'
- 27 → 'aa'
- 50 → 'ax'
- 70 → 'br'
整体序列为:a, b, c……z, aa, ab……zz, aaa, aab……zzz
我的初始尝试
最开始我想用迭代生成所有可能的字母组合,直到找到第n个结果,但这个方法效率很低,而且返回的是元组列表,完全不符合预期:
from string import ascii_lowercase import itertools def func(n): c = 0 l = [] for size in itertools.count(1): for s in itertools.product(ascii_lowercase, repeat=size): l.append(s) c+=1 if c == n: return l
最终解决方案
在社区朋友们的帮助下,我找到了更高效的递归解法。核心思路是通过除法和取余逐步拆解数字,重点处理26的倍数这种特殊情况(因为常规进制转换从0开始,而这里的序列是从1起步的):
# 建立1-26到a-z的映射字典 d = { n-96:chr(n) for n in range(97,123) } def div(n): # 处理26的倍数且大于26的情况,需要把商减1再递归 if ((n%26) == 0 and n>26): return func(n//26 - 1) # 商小于等于0时返回空字符串 elif (n//26) <= 0: return '' # 单独处理n=26的边界情况 elif n == 26: return 'z' # 商在1-26范围内,直接返回对应字母 elif (n//26) in d: return d[n//26] # 商大于26时继续递归拆解 else: return func(n//26) def mod(n): if n<=0: return '' # 26的倍数且大于26时,余数对应z elif ((n%26) == 0 and n>26): return 'z' elif (n%26)<=0: return '' # 余数在1-26范围内,返回对应字母 else: return d[n%26] def func(n): res_div = div(n) res_mod = mod(n) return (res_div + res_mod)
这个方法不需要生成所有前置组合,通过递归逐步构建结果字符串,完美适配了从1开始的特殊进制转换逻辑,效率比初始尝试提升了很多。
内容的提问来源于stack exchange,提问作者Rohan
相关产品推荐
相关产品推荐

