sun*_*raj 48

def colnum_string(n):
    string = ""
    while n > 0:
        n, remainder = divmod(n - 1, 26)
        string = chr(65 + remainder) + string
    return string

print(colnum_string(28))
#output:AB
Run Code Online (Sandbox Code Playgroud)

  • 字符串是不可变的,因此,在字符串前面添加成本很高,因为所有内容都必须移动。考虑使用可变替代方案,例如“list”并转换为字符串“"”.join(lst)` (2认同)

小智 19

所述xlsxwriter库包括一个转换功能,xlsxwriter.utility.xl_col_to_name(index)并且是github上

这是一个有效的例子:

>>> import xlsxwriter 
>>> xlsxwriter.utility.xl_col_to_name(10)
'K'
>>> xlsxwriter.utility.xl_col_to_name(1)
'B'
>>> xlsxwriter.utility.xl_col_to_name(0)
'A'
Run Code Online (Sandbox Code Playgroud)

请注意,它使用的是零索引.

  • 这个库很棒,使用一个众所周知的工作库而不是自定义代码是个好主意 (3认同)
  • @akashkarothiya xlsxwriter使用基于0的索引(和python一样) (2认同)

Bri*_*een 14

openpyxl库包括的转换功能,你正在寻找的,(其中包括)get_column_letter

>>> from openpyxl.utils.cell import get_column_letter
>>> get_column_letter(1)
'A'
>>> get_column_letter(10)
'J'
>>> get_column_letter(3423)
'EAQ'
Run Code Online (Sandbox Code Playgroud)


Gia*_*lli 10

我的配方灵感来自另一个关于任意基础转换的答案(/sf/answers/1733429421/

import string

def n2a(n,b=string.ascii_uppercase):
   d, m = divmod(n,len(b))
   return n2a(d-1,b)+b[m] if d else b[m]
Run Code Online (Sandbox Code Playgroud)

例子:

for i in range(23,30):
    print (i,n2a(i))
Run Code Online (Sandbox Code Playgroud)

产出

23 X
24 Y
25 Z
26 AA
27 AB
28 AC
29 AD
Run Code Online (Sandbox Code Playgroud)

  • 请注意,该索引是从零开始的! (2认同)

Mar*_*ius 6

在 Meta 的一些艰难的爱之后编辑

此过程涉及将数字除以 26,直到达到小于 26 的数字,每次取余数并添加 65,因为 65 是 'A' 在ASCII 表中的位置。如果这对您没有意义,请阅读 ASCII。

请注意,与最初链接的问题一样,这是从 1 开始的而不是从 0 开始的,因此A -> 1, B -> 2

def num_to_col_letters(num):
    letters = ''
    while num:
        mod = (num - 1) % 26
        letters += chr(mod + 65)
        num = (num - 1) // 26
    return ''.join(reversed(letters))
Run Code Online (Sandbox Code Playgroud)

示例输出:

for i in range(1, 53):
    print i, num_to_col_letters(i)
1 A
2 B
3 C
4 D
...
25 Y
26 Z
27 AA
28 AB
29 AC
...
47 AU
48 AV
49 AW
50 AX
51 AY
52 AZ
Run Code Online (Sandbox Code Playgroud)

  • 这为 `num_to_col_letters(26)` 提供了错误的输出,它输出了 `"A@"` (5认同)
  • @JRichardSnape 我同意我的答案基本上被破坏了,编辑或多或少提供了一种全新的算法,而不是解决我的小问题。 (2认同)
  • @jason_cant_code 似乎仍然在网站上活跃,所以也许可以说服他们切换已接受的答案。 (2认同)

Luk*_*uke 5

只为人们仍然对此感兴趣.@Mspurim评论说@Marius选择的答案在某些情况下会输出错误的输出.这是我的答案.

import string
def convertToTitle(num):
    title = ''
    alist = string.uppercase
    while num:
        mod = (num-1) % 26
        num = int((num - mod) / 26)  
        title += alist[mod]
    return title[::-1]
Run Code Online (Sandbox Code Playgroud)


Axa*_*lix 5

不带库的递归单行解决方案

def column(num, res = ''):
   return column((num - 1) // 26, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'[(num - 1) % 26] + res) if num > 0 else res
Run Code Online (Sandbox Code Playgroud)