如何生成的字母和数字的所有组合,但在特定的格式
我试图创建与大写字母和数字的所有可能的组合,但在这个非常特殊的格式创建一个文件一个词表生成:如何生成的字母和数字的所有组合,但在特定的格式
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
...
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
解决方案更优雅,可能也更快。我只是想纠正你的代码。
感谢您指出这一点,您说得对,最好使用“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
感谢downvote。意识到有一个错误,并修复它。 –
非常感谢@Coldspeed这现在工作很好。 –
@ArewrewSummers干杯。考虑看看[this](https://stackoverflow.com/help/someone-answers)。 –