代码之家  ›  专栏  ›  技术社区  ›  2Obe

创建按字母顺序升序的列表

  •  2
  • 2Obe  · 技术社区  · 7 年前

    我想创建按字母顺序升序的名称,如excel中的列名。这就是我想要的smth。像a,b,c,…,z,aa,ab,…,az,…,zz,aaa,aab,。。。。

    我试过:

    for i in range(1000):
        mod = int(i%26)
        div = int(i/26)
        print(string.ascii_lowercase[div]+string.ascii_lowercase[mod])
    

    zz 但它失败了,因为它没有索引了

    aa
    ab
    ac
    ad
    ae
    af
    ag
    ah
    ai
    aj
    ak
    al
    .
    .
    .
    zz
    

    索引器

    5 回复  |  直到 7 年前
        1
  •  4
  •   Delgan    7 年前

    你可以利用 itertools.product()

    from itertools import product
    from string import ascii_lowercase
    
    for i in range(1, 4):
        for x in product(ascii_lowercase, repeat=i):
            print(''.join(x))
    

    首先,您需要所有字母,然后是所有对,然后是所有三元组,等等。这就是为什么我们首先需要迭代所有您想要的字符串长度( for i in range(...)

    然后,我们需要所有可能的关联 i product(ascii_lowercase) for 循环重复 我 时代。

    我 需要,最后才是 join()

    对于 while :

    def generate():
        i = 0
        while True:
            i += 1
            for x in product(ascii_lowercase, repeat=i):
                yield ''.join(x)
    
    generator = generate()
    next(generator)  # 'a'
    next(generator)  # 'b'
    ...
    
        2
  •  4
  •   andersource    7 年前

    对于一般解决方案,我们可以使用生成器和 islice 从…起 itertools

    import string
    from itertools import islice
    def generate():
        base = ['']
        while True:
            next_base = []
            for b in base:
                for i in range(26):
                    next_base.append(b + string.ascii_lowercase[i])
                    yield next_base[-1]
            base = next_base
    
    print('\n'.join(islice(generate(), 1000)))
    

    以及输出:

    a
    b
    c
    ...
    z
    aa
    ab
    ...
    zz
    aaa
    aab
    ...
    

    你可以用 小岛 需要多少线就拿多少线。

        3
  •  1
  •   user8380069 user8380069    7 年前

    尝试:

    >>import string
    >>string.ascii_lowercase
    'abcdefghijklmnopqrstuvwxyz'
    >>len(string.ascii_lowercase)
    26
    

    当您在下线的索引超过26时,将引发异常

    div = int(i/26)
    

    ,因为ascii_小写长度:

    for i in range(26*26):  # <--- 26 is string.ascii_lowercase
        mod = int(i%26)
        div = int(i/26)
        print(string.ascii_lowercase[div]+string.ascii_lowercase[mod])
    

    编辑:

    或者您可以使用:

    import string
    
    n = 4  # number of chars
    small_limit = len(string.ascii_lowercase)
    limit = small_limit ** n
    i = 0
    while i < limit:
        s = ''
        for c in range(n):
            index = int(i/(small_limit**c))%small_limit
            s += string.ascii_lowercase[index]
        print(s)
        i += 1
    
        4
  •  0
  •   Joe    7 年前

    from string import ascii_lowercase
    l = list(ascii_lowercase) + [letter1+letter2 for letter1 in ascii_lowercase for letter2 in ascii_lowercase]+ [letter1+letter2+letter3 for letter1 in ascii_lowercase for letter2 in ascii_lowercase for letter3 in ascii_lowercase]
    
        5
  •  0
  •   jodag    7 年前

    上面提供了这个问题的答案 Code Review SE

    def increment_char(c):
        return chr(ord(c) + 1) if c != 'z' else 'a' 
    
    def increment_str(s):
        lpart = s.rstrip('z')
        num_replacements = len(s) - len(lpart)
        new_s = lpart[:-1] + increment_char(lpart[-1]) if lpart else 'a' 
        new_s += 'a' * num_replacements
        return new_s
    
    s = ''
    for _ in range(1000):
        s = increment_str(s)
        print(s)
    
    推荐文章