如何生成的字母和数字的所有组合,但在特定的格式

问题描述:

我试图创建与大写字母和数字的所有可能的组合,但在这个非常特殊的格式创建一个文件一个词表生成:如何生成的字母和数字的所有组合,但在特定的格式

AAA00AA(大写,大写,大写,数字,数字,大写,大写)

所以第一个字符串应该是AAA00AA,最后一个是ZZZ99ZZ。 有超过10亿种可能的组合,我正在使用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) 

您可以使用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 
... 
+0

感谢downvote。意识到有一个错误,并修复它。 –

+0

非常感谢@Coldspeed这现在工作很好。 –

+0

@ArewrewSummers干杯。考虑看看[this](https://stackoverflow.com/help/someone-answers)。 –

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

...

一切你可以离开,因为它们。 @Coldspeed的itertools.product解决方案更优雅,可能也更快。我只是想纠正你的代码。

+0

感谢您指出这一点,您说得对,最好使用“with open()” –

使用列表理解:

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