在做f4ck上的游戏时,第三题需要生成字典的,就到网上搜索现成的排列组合的例子,找个一个,(链接找不到了)。那篇文章用了很多种方法,并比较了执行时间,很好。我找了一种感觉很好的,记录一下。
字典生成,共五位,已知四个字母,然后另一位是数字。这五位排列组合,共有5!*10中排列。
先上算法:
Read more...
#-*-coding:utf-8-*-
str1 = 'f9ck'
def permute(seq):
new_list = []
seqn = [seq.pop()]
while seq:
newseq = []
new = seq.pop()
#print "seq:",seq,'seqn', seqn ,'new', new
for i in range(len(seqn)):
item = seqn[i]
for j in range(len(item)+1):
#print u'left:',item[:j],u'midle:',new,u'right:',item[j:]
#print ''.join([item[:j],new,item[j:]])
newseq.append(''.join([item[:j],new,item[j:]]))
seqn = newseq
#print 'newseq',newseq
return seqn
file2 = open('p00.txt','w+')
for i in range(10):
str2 = str1 + str(i)
seq = list(str2)
thelist = permute(seq)
passwdlist = []
for passwd in thelist:
newpasswd = passwd + '\n'
passwdlist.append(newpasswd)
file2.writelines(passwdlist)
print len(passwdlist)
#file1.close()
file2.close()
分析一下,
第一步,取一位,放入seqn,这个列表用于保存过程中生成的序列。
第二步,从剩下的中再取一位,放入new。
第三步,for循环,将new中的字母插入到seqn列表元素的每一位中。生成的新序列赋值seqn。
for循环解释一下:作者当时就是举了个例子,如果想得到1,2,3这三个数的排列组合,通过下面的方法。
如图:
[caption id="attachment_532" align="alignnone" width="122" caption="排列选择"][/caption]