How to make a continuous alphabetic list python (from a-z then from aa, ab, ac etc)

浪尽此生 提交于 2019-11-26 22:24:00

问题


I would like to make a alphabetical list for an application similar to an excel worksheet.

A user would input number of cells and I would like to generate list. For example a user needs 54 cells. Then I would generate

'a','b','c',...,'z','aa','ab','ac',...,'az', 'ba','bb'

I can generate the list from [ref]

 from string import ascii_lowercase
 L = list(ascii_lowercase) 

How do i stitch it together? A similar question for PHP has been asked here. Does some one have the python equivalent?


回答1:


Use itertools.product.

from string import ascii_lowercase
import itertools

def iter_all_strings():
    for size in itertools.count(1):
        for s in itertools.product(ascii_lowercase, repeat=size):
            yield "".join(s)

for s in iter_all_strings():
    print(s)
    if s == 'bb':
        break

Result:

a
b
c
d
e
...
y
z
aa
ab
ac
...
ay
az
ba
bb

This has the added benefit of going well beyond two-letter combinations. If you need a million strings, it will happily give you three and four and five letter strings.


Bonus style tip: if you don't like having an explicit break inside the bottom loop, you can use islice to make the loop terminate on its own:

for s in itertools.islice(iter_all_strings(), 54):
    print s



回答2:


You can use a list comprehension.

from string import ascii_lowercase
L = list(ascii_lowercase) + [letter1+letter2 for letter1 in ascii_lowercase for letter2 in ascii_lowercase]



回答3:


Following @Kevin 's answer :

from string import ascii_lowercase
import itertools

# define the generator itself
def iter_all_strings():
    size = 1
    while True:
        for s in itertools.product(ascii_lowercase, repeat=size):
            yield "".join(s)
        size +=1

The code below enables one to generate strings, that can be used to generate unique labels for example.

# define the generator handler
gen = iter_all_strings()
def label_gen():
    for s in gen:
        return s

# call it whenever needed
print label_gen()
print label_gen()
print label_gen()



回答4:


I've ended up doing my own. I think it can create any number of letters.

def AA(n, s):
    r = n % 26
    r = r if r > 0 else 26
    n = (n - r) / 26
    s = chr(64 + r) + s

    if n > 26: 
        s = AA(n, s)
    elif n > 0:
        s = chr(64 + n) + s

    return s

n = quantity | r = remaining (26 letters A-Z) | s = string

To print the list :

def uprint(nc):
    for x in range(1, nc + 1):
        print AA(x,'').lower()

Used VBA before convert to python :

Function AA(n, s)

    r = n Mod 26
    r = IIf(r > 0, r, 26)
    n = (n - r) / 26
    s = Chr(64 + r) & s

    If n > 26 Then
        s = AA(n, s)
    ElseIf n > 0 Then
        s = Chr(64 + n) & s
    End If

    AA = s

End Function


来源:https://stackoverflow.com/questions/29351492/how-to-make-a-continuous-alphabetic-list-python-from-a-z-then-from-aa-ab-ac-e

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!