重复像excel列这样的字母?

时间:2017-02-11 13:38:22

标签: python excel string modulus

我想创建一个类似于Microsoft Excel中列字母的字符串列表。例如,在26列后,下一列变为AAABAC等。

我尝试过使用模数运算符,但我最终得到的是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
...

5 个答案:

答案 0 :(得分:4)

您可以使用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']

为了概括,我们定义了一个能够构建越来越大的产品的发电机。请注意,yield from仅在python 3.3+中可用,但如果您使用的是python 2,则可以使用for循环来生成每个项目。

 >>> 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']

答案 1 :(得分:3)

此生成器函数将使用任意字母表:

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'

    b)增加它:将其设置为下一个字母

    c)将所有后续字符重置为第一个字母字符

  2. 如果找不到这样的可递增字符,请重新开始使用所有第一个字母,将长度增加1

  3. 可以以(更大)更大的内存占用为代价编写更具可读性/综合性的功能,尤其是在生成许多标签的情况下:

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

答案 2 :(得分:1)

基于这个答案:https://stackoverflow.com/a/182009/6591347

@RestController
public class HelloController {

    @RequestMapping("/")
    public String index() {
        return "Greetings from Spring Boot!";
    }

}

答案 3 :(得分:0)

我的解决方案:

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

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

<强>说明:
首先将A-Z字母创建为列表:

map(chr, range(65,91))

然后使用产品创建组合(长度从1开始,到10结束)

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

最后使用itertools.chain

将所有这些生成器连接到单个生成器中

答案 4 :(得分:0)

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

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

并向下复制。

enter image description here

这将对前16384件物品有效