2017-02-11 60 views
3

我想创建一个类似于Microsoft Excel中列字母的字符串列表。例如,26列之后,接下来的列将成为AAABAC重复字母像excel列?

我已经使用了模运算试过,但我刚刚结束了AABBCC等..

import string 

passes_through_alphabet = 0 

for num, col in enumerate([_ for _ in range(40)]): 
    if num % 26 == 0: 
     passes_through_alphabet += 1 
    excel_col = string.ascii_uppercase[num%26] * passes_through_alphabet 
    print(num, excel_col) 

0 A 
1 B 
2 C 
3 D 
... 
22 W 
23 X 
24 Y 
25 Z 
26 AA 
27 BB 
28 CC 
... 

回答

2

您可以使用itertools.product此:

>>> import itertools 
>>> list(itertools.product(string.ascii_uppercase, repeat=2)) 
[('A', 'A'), ('A', 'B'), ('A', 'C'), ('A', 'D'), ... 

与第一组的字母结合这一点,并在加入双成绩:

>>> list(
...  itertools.chain(
...   string.ascii_uppercase, 
...  (''.join(pair) for pair in itertools.product(string.ascii_uppercase, repeat=2)) 
...)) 
['A', 'B', 'C', .. 'AA', 'AB', 'AC' .. 'ZZ'] 

概括地说,我们定义一个生成越来越大的产品的生成器。需要注意的是,从产量仅在蟒蛇3.3+可用的,但你可以只使用一个for循环,产生每一个项目,如果你对蟒蛇2.

>>> def excel_cols(): 
...:  n = 1 
...:  while True: 
...:   yield from (''.join(group) for group in itertools.product(string.ascii_uppercase, repeat=n)) 
...:   n += 1 

>>> list(itertools.islice(excel_cols(), 28)) 
['A', 
'B', 
'C', 
... 
'X', 
'Y', 
'Z', 
'AA', 
'AB'] 
+0

这将停止在'ZZ',不像Excel中! – schwobaseggl

+0

但是,如何获取最初的单个字母呢? – blacksite

+0

@schwobaseggl我已经更新为初始设置+连续字母集。 –

2

该发电机的功能将与任意的字母工作:

import string 

def labels(alphabet=string.ascii_uppercase): 
    assert len(alphabet) == len(set(alphabet)) # make sure every letter is unique 
    s = [alphabet[0]] 
    while 1: 
     yield ''.join(s) 
     l = len(s) 
     for i in range(l-1, -1, -1): 
      if s[i] != alphabet[-1]: 
       s[i] = alphabet[alphabet.index(s[i])+1] 
       s[i+1:] = [alphabet[0]] * (l-i-1) 
       break 
     else: 
      s = [alphabet[0]] * (l+1) 

> x = labels(alphabet='ABC') 
> print([next(x) for _ in range(20)]) 
['A', 'B', 'C', 'AA', 'AB', 'AC', 'BA', 'BB', 'BC', 'CA', 'CB', 'CC', 'AAA', 'AAB', ... ] 

它可以生成从当前的下一个字符串:

  1. 查找是不是最后的字母后面的第一个字符:如!= 'Z'

    二)增加它:它设置为下一个字母开头

    C)重置所有以下字符的第一个字母字符

  2. 如果没有这样的递增的字符被发现,开始在所有第一字母,通过1

一个增加长度可在(多)较大的内存空间的成本写一个更可读的/全面的功能,特别是如果米任何标签生成:

def labels(alphabet=string.ascii_uppercase): 
    agenda = deque(alphabet) 
    while agenda: 
     s = agenda.popleft() 
     yield s 
     agenda.append([s+c for c in alphabet]) 
1

基于这样的回答:https://stackoverflow.com/a/182009/6591347

def num_to_excel_col(n): 
    if n < 1: 
     raise ValueError("Number must be positive") 
    result = "" 
    while True: 
     if n > 26: 
      n, r = divmod(n - 1, 26) 
      result = chr(r + ord('A')) + result 
     else: 
      return chr(n + ord('A') - 1) + result 
1

我的解决办法:

itertools.chain(*[itertools.product(map(chr, range(65,91)), repeat=i) for i in xrange(1, 10)]) 

请注意魔数10 - 这是列的最大字母名称。

说明:
首先创建AZ字母列表:

map(chr, range(65,91)) 

然后用产品,用于创建所述组合(长度从1开始,并在10结束)

itertools.product(map(chr, range(65,91)), repeat=i) 

而最后将所有这些发电机串联成单个发电机使用itertools.chain

1

在Excel中使用公式,在单元格A1 进入

=SUBSTITUTE(SUBSTITUTE(ADDRESS(1,ROW()),"$",""),"1","") 

和复制向下。

enter image description here

这将是有效期为第16384项