Как создать непрерывный алфавитный список 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