Как генерировать все комбинации букв и цифр, но в определенном формате

Я пытаюсь создать генератор списка слов, который создает файл со всеми возможными комбинациями прописных букв и цифр, но в этом очень специфическом формате:

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
Другие вопросы по тегам