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

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

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

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

Я могу создать список из [ref]

 from string import ascii_lowercase
 L = list(ascii_lowercase) 

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


person Seb    schedule 30.03.2015    source источник


Ответы (6)


Используйте 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
person Kevin    schedule 30.03.2015
comment
в любом случае, я мог бы сказать, начните с hhhh - person CodeGuru; 06.02.2019
comment
Это блестяще. Хорошая работа, сэр. - person Rithwik; 03.03.2019

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

from string import ascii_lowercase
L = list(ascii_lowercase) + [letter1+letter2 for letter1 in ascii_lowercase for letter2 in ascii_lowercase]
person Julien Spronck    schedule 30.03.2015
comment
Кажется, это не дает однобуквенных комбинаций «а», «б» и т. Д. - person Kevin; 30.03.2015
comment
Хорошо, но что, если пользователю нужно более 702 различных строк? Им нужно будет перейти от «зз» к «ааа». - person Kevin; 30.03.2015
comment
достаточно честно ... я не понял этого из вашего вопроса - person Julien Spronck; 30.03.2015

После ответа @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()
person ultrahamster    schedule 28.10.2016

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

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

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

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
person neo    schedule 23.02.2019
comment
Это работает очень хорошо. Следует отметить, что строка в функции AA n = (n - r) / 26 должна использовать деление пола (как в n = (n - r) // 26) в Python 3.x. - person JolonB; 11.05.2020

Распечатайте набор xl диапазонов ячеек строчных и прописных фрахтователей

Верхний регистр:

from string import ascii_uppercase
import itertools
def iter_range_strings(start_colu):
    for size in itertools.count(1):
        for string  in itertools.product(ascii_uppercase, repeat=size):
            yield "".join(string)

input_colume_range = ['A', 'B']
input_row_range= [1,2]
for row in iter_range_strings(input_colume_range[0]):
    for colum in range(int(input_row_range[0]), int(input_row_range[1]+1)):
        print(str(row)+ str(colum))
    if row ==  input_colume_range[1]:
        break

Результат:

A1
A2
B1
B2
person Narayana Reddy    schedule 02.05.2020

В две строки (плюс импорт):

from string import ascii_uppercase as ABC

count = 100
ABC+=' '
[(ABC[x[0]] + ABC[x[1]]).strip() for i in range(count) if (x:= divmod(i-26, 26))]

Оберните его в функцию/лямбда, если вам нужно повторно использовать.

person Justin Palmer    schedule 23.09.2020