Как создать непрерывный алфавитный список python (из a-z, затем из aa, ab, ac и т.д.)

Я хотел бы сделать алфавитный список для приложения, подобного рабочему листу excel.

Пользователь вводит количество ячеек, и я хотел бы создать список. Например, пользователю требуется 54 ячейки. Тогда я бы сгенерировал

a, b, c,...,

Я могу сгенерировать список из [ref]

 from string import ascii_lowercase
 L = list(ascii_lowercase) 

Как сшить его вместе? Аналогичный вопрос для PHP был задан здесь. Есть ли у кого-то эквивалент python?

Ответ 1

Используйте 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

Результат:

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

Это имеет дополнительное преимущество, выходящее далеко за рамки двухбуквенных комбинаций. Если вам нужен миллион строк, он с радостью даст вам три, четыре и пять буквенных строк.


Совет по бонусному стилю: если вам не нравится явный break внутри нижнего цикла, вы можете использовать islice чтобы завершить цикл самостоятельно:

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

Ответ 2

Вы можете использовать понимание списка.

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

Ответ 3

После ответа @Kevin:

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

Приведенный ниже код позволяет генерировать строки, которые могут использоваться, например, для создания уникальных ярлыков.

# 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

Я закончил делать свое. Я думаю, что это может создать любое количество букв.

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 AZ) | s = string

Чтобы распечатать список:

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

Используется VBA перед конвертацией в 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