在做f4ck上的游戏时,第三题需要生成字典的,就到网上搜索现成的排列组合的例子,找个一个,(链接找不到了)。那篇文章用了很多种方法,并比较了执行时间,很好。我找了一种感觉很好的,记录一下。 字典生成,共五位,已知四个字母,然后另一位是数字。这五位排列组合,共有5!*10中排列。 先上算法:
#-*-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]

上一篇:
下一篇:

相关文章:

Categories: 博客记录

1 Responses so far.

  1. 0X55AA 说:

    passwdlist = [passwd+'\n' for passwd in thelist]

Leave a Reply