Как генерировать все комбинации букв и цифр, но в определенном формате
Я пытаюсь создать генератор списка слов, который создает файл со всеми возможными комбинациями прописных букв и цифр, но в этом очень специфическом формате:
AAA00AA (прописные, прописные, прописные, цифры, цифры, прописные, прописные)
Таким образом, первая строка будет AAA00AA, а последняя ZZZ99ZZ. Есть более 1 миллиарда возможных комбинаций, и я использую itertools.product
функция.
Тем не менее, я застрял на том, как циклически просматривать результаты каждой итерации, чтобы заставить каждую группу (AAA 00 AA) объединяться между собой. Вот что я получил до сих пор, но каждый цикл запускается только один раз. Например, когда первая группа AAA 00 AA достигает ZZZ 00 AA, мне нужно получить вторую группу за 1 итерацию до AAA 01 AA и так далее до третьей группы.
Я уверен, что моя логика вложения циклов неверна или, возможно, мне нужно использовать какой-то другой подход, но я не знаю, что делать. Может кто-нибудь помочь, пожалуйста? Вот мой код до сих пор.
import string
import itertools
import datetime
letters = string.ascii_uppercase
digits = string.digits
first_group = itertools.product(letters, repeat=3)
second_group = itertools.product(digits, repeat=2)
third_group = itertools.product(letters, repeat=2)
FILE = open("mylist.txt","w")
start = datetime.datetime.now()
for i in first_group:
first = ''.join(i)
FILE.write(first + '\n')
for a in second_group:
second = first +''.join(a)
FILE.write(second + '\n')
for x in third_group:
string = second +''.join(x)
FILE.write(string + '\n')
string = ''
FILE.close()
print 'DONE! - Finished in %s' % (datetime.datetime.now() - start)
3 ответа
Ты можешь использовать itertools.product
снова присоединиться к субпродуктам.
first_group = itertools.product(letters, repeat=3)
second_group = itertools.product(digits, repeat=2)
third_group = itertools.product(letters, repeat=2)
for prod in itertools.product(first_group, second_group, third_group):
string = ''.join([''.join(k) for k in prod])
FILE.write(string + '\n')
Выход:
AAA00AA
AAA00AB
AAA00AC
AAA00BA
AAA00BB
AAA00BC
AAA00CA
AAA00CB
AAA00CC
AAA01AA
...
import string
import itertools
import datetime
letters = string.ascii_uppercase
digits = string.digits
first_group = itertools.product(letters, repeat=3)
second_group = itertools.product(digits, repeat=2)
third_group = itertools.product(letters, repeat=2)
start = datetime.datetime.now()
with open("mylist.txt","w") as FILE:
for i in first_group:
first = ''.join(i)
for j in second_group:
second = ''.join(j)
for k in third_group:
FILE.write(first + second + ''.join(k) + '\n')
print 'DONE! - Finished in %s' % (datetime.datetime.now() - start)
Формирует:
AAA00AA
AAA00AB
AAA00AC
AAA00AD
AAA00AE
AAA00AF
...
Все остальное вы можете оставить как есть. itertools.product
Решение от @Coldspeed, однако, более изящно и, вероятно, быстрее. Я просто хотел исправить твой код.
Используйте понимание списка:
res = ["".join(itertools.chain(a,b,c)) for c in third_group for b in second_group for a in first_group]
res
['AAA00AA', 'AAB00AA', 'AAC00AA', 'AAD00AA', 'AAE00AA', 'AAF00AA', 'AAG00AA', 'AAH00AA', 'AAI00AA', 'AAJ00AA', 'AAK00AA', 'AAL00AA', 'AAM00AA', 'AAN00AA', 'AAO00AA', 'AAP00AA', 'AAQ00AA', 'AAR00AA', 'AAS00AA', 'AAT00AA', 'AAU00AA', 'AAV00AA', 'AAW00AA', 'AAX00AA', 'AAY00AA',...]
Вы даже можете сделать его объектом-генератором:
for e in ("".join(itertools.chain(a,b,c)) for c in third_group for b in second_group for a in first_group):
print e