Python 将数字转换为Excel’;s基地26
好吧,我被一件看似简单的事情困住了。我试图将一个数字转换为以26为基数(即3=C,27=AA等)。我猜我的问题与模型中没有0有关?不确定。但是如果你运行代码,你会发现数字52、104,尤其是676左右的数字真的很奇怪。有人能给我一个提示,说明我没有看到什么吗?我会很感激的。(为了避免浪费时间,Python 将数字转换为Excel’;s基地26,python,numbers,base,Python,Numbers,Base,好吧,我被一件看似简单的事情困住了。我试图将一个数字转换为以26为基数(即3=C,27=AA等)。我猜我的问题与模型中没有0有关?不确定。但是如果你运行代码,你会发现数字52、104,尤其是676左右的数字真的很奇怪。有人能给我一个提示,说明我没有看到什么吗?我会很感激的。(为了避免浪费时间,@是ascii字符64,A是ascii字符65) def toBase26(x): x=int(x) 如果x==0: 返回“0” 如果x
@
是ascii字符64,A
是ascii字符65)
def toBase26(x):
x=int(x)
如果x==0:
返回“0”
如果x<0:
负=真
x=绝对值(x)
其他:
否定=错误
def数字_值(val):
返回str(chr(int(val)+64))
数字=1
base26=“”
当26**位
因此,我通过对我的函数(while循环中的2if语句)进行一些更改,找到了一个临时解决方法。无论如何,我的列被限制在500个,下面对函数的更改似乎达到了x=676,所以我很满意。然而,如果你们中的任何一个人为任何x找到了一个通用的解决方案(可能是我的代码可能会有所帮助),那将是非常酷的
def toBase26(x):
x = int(x)
if x == 0:
return '0'
if x < 0:
negative = True
x = abs(x)
else:
negative = False
def digit_value (val):
return str(chr(int(val)+64))
digits = 1
base26 = ""
while 26**digits < x:
digits += 1
while digits != 0:
remainder = x%(26**(digits-1))
if remainder == 0:
remainder += 26**(digits-1)
if digits == 1:
remainder -= 1
base26 += digit_value((x-remainder)/(26**(digits-1)))
x = remainder
digits -= 1
if negative:
return '-'+base26
else:
return base26
def toBase26(x):
x=int(x)
如果x==0:
返回“0”
如果x<0:
负=真
x=绝对值(x)
其他:
否定=错误
def数字_值(val):
返回str(chr(int(val)+64))
数字=1
base26=“”
当26**位
转换为Excel的“base 26”时出现的问题是Excel,一个数字AA
实际上是26*26**1+26*26**0
,而普通的base 26数字系统则会产生一个1*26**2+1*26**1+0*26**0
。所以我们不能用这里的常规方法来转换这些数字
相反,我们必须推出自己的divmod\u excel
函数:
def divmod_excel(n):
a, b = divmod(n, 26)
if b == 0:
return a - 1, b + 26
return a, b
import string
def to_excel(num):
chars = []
while num > 0:
num, d = divmod_excel(num)
chars.append(string.ascii_uppercase[d - 1])
return ''.join(reversed(chars))
这样,我们就可以创建一个to_excel
函数:
def divmod_excel(n):
a, b = divmod(n, 26)
if b == 0:
return a - 1, b + 26
return a, b
import string
def to_excel(num):
chars = []
while num > 0:
num, d = divmod_excel(num)
chars.append(string.ascii_uppercase[d - 1])
return ''.join(reversed(chars))
对于另一个方向,这要简单一点
from functools import reduce
def from_excel(chars):
return reduce(lambda r, x: r * 26 + x + 1, map(string.ascii_uppercase.index, chars), 0)
这组函数做了正确的事情:
>>> to_excel(26)
'Z'
>>> to_excel(27)
'AA'
>>> to_excel(702)
'ZZ'
>>> to_excel(703)
'AAA'
>>> from_excel('Z')
26
>>> from_excel('AA')
27
>>> from_excel('ZZ')
702
>>> from_excel('AAA')
703
实际上,我们可以通过简单地检查是否可以将它们链接起来以复制原始数字来确认它们彼此的工作方式是否正确:
for i in range(100000):
if from_excel(to_excel(i)) != i:
print(i)
# (prints nothing)
对不起,我是用Pascal写的,不懂Python
function NumeralBase26Excel(numero: Integer): string;
var
algarismo: Integer;
begin
Result := '';
numero := numero - 1;
if numero >= 0 then
begin
algarismo := numero mod 26;
if numero < 26 then
Result := Chr(Ord('A') + algarismo)
else
Result := NumeralBase26Excel(numero div 26) + Chr(Ord('A') + algarismo);
end;
end;
函数numberbase26excel(numero:Integer):字符串;
变量
阿尔加里斯莫:整数;
开始
结果:='';
数字:=数字-1;
如果numero>=0,则
开始
algarismo:=第26个模块的数字;
如果数值小于26,则
结果:=Chr(Ord('A')+algarismo)
其他的
结果:=numericbase26excel(numerio div 26)+Chr(Ord('A')+algarismo);
结束;
结束;
通常情况下,0需要一个符号,26应该是基数26的第一个两位数。比较基数2和基数10,其中这些数字是第一个两位数,数值范围从0
到n-1
。对,但这并不能真正解决我要做的事情。我需要excel样式的列和从列编号到列标签的简单转换。是不是@your zero symbol?@Yaroslav?您尝试的不是转换为base26。您正在尝试将数字映射为字母。@Ev。库尼斯。是的,那么把1000个字母转换成字母的最好方法是什么呢?通过在while循环中添加if rements==0:rements+=26**(digits-1),我得到了一些更好的结果,但它仍然在A上遗漏了作为第一个“digits”,您忘记定义了divmod
。@我相信。@IMCoins就是这个。为了您,我的好先生,我的帽子摘了。我基本上是用我的第二个函数来解决你的问题,但你的是我所做工作的概括。美好的