生成四位不重复数字(0-9)的所有组合,四位0-9,Python语言: 生成


Python语言: 生成四位不重复数字(0-9)的所有组合#coding=cp936#关于这个问题的精彩讨论参见这里#  <a href="http://groups.google.com/group/python-cn/browse_thread/thread/4d9eda8e422a6cf8">http://groups.google.com/group/python-cn/browse_thread/thread/4d9eda8e422a6cf8#在我的电脑上#init_set 1000 times 5.529#init_set2 1000 times 4.674#init_set3 1000 times 3.287#init_set4 1000 times 18.271#init_set5 1000 times 2.069def init_set8(r10=range(10)):    """    把循环内的range函数提到外面    times5.486 ==> 4.427    """    ret = []    for i in r10:        for j in r10:            for k in r10:                for l in r10:                    if i != j and i != k and i != l and j != k and j != l and k != l:                        ret.append((i, j, k, l))    return rettiming(init_set8, 1000)def init_set9(r10=range(10)):    """    for 循环改成列表推导    times5.486 ==>3.773     """    return [(i, j, k, l)        for i in r10        for j in r10        for k in r10        for l in r10        if ( i != j and i != k and i != l and j != k and j != l and k != l) ]timing(init_set9, 1000)def init_set10(r10=range(10)):    """    return 一个 generator    init_set10 1000 times 0.004    这个无疑是最快的 :P    我最喜欢这个解决方案,空间换时间的算法    对这个问题属于 过度优化    """    return ((i, j, k, l)            for i in r10            for j in r10            for k in r10            for l in r10            if( i != j and i != k and i != l and j != k and j != l and k != l) )timing(init_set10, 1000)def init_set11():    """    用代码的空间代价换取计算P4_4的时间    init_set11 1000 times 7.268 OMG    reduce(lambda x,y:x+y,l)太慢了    """    c10_4=[( i, j, k, l ) for i in xrange(0, 10)                          for j in xrange(i+1, 10)                          for k in xrange(j+1, 10)                          for l in xrange(k+1, 10) ]    ret=reduce(lambda x,y:x+y,            [ [ (i, j, k, l),                (i, j, l, k),                (i, k, j, l),                (i, k, l, j),                (i, l, j, k),                (i, l, k, j),                (j, i, k, l),                (j, i, l, k),                (j, k, i, l),                (j, k, l, i),                (j, l, i, k),                (j, l, k, i),                (k, i, j, l),                (k, i, l, j),                (k, j, i, l),                (k, j, l, i),                (k, l, i, j),                (k, l, j, i),                (l, i, j, k),                (l, i, k, j),                (l, j, i, k),                (l, j, k, i),                (l, k, i, j),                (l, k, j, i),]                for i, j, k, l in c10_4 ],            )     return retdef init_set12():    """    generator是伟大的发明,数据流编程万岁    init_set12 1000 times 1.758     """    c10_4=(( i, j, k, l ) for i in xrange(0, 10)            for j in xrange(i+1, 10)            for k in xrange(j+1, 10)            for l in xrange(k+1, 10) )    from  itertools import chain    ret=chain(        *( ( (i, j, k, l),             (i, j, l, k),             (i, k, j, l),             (i, k, l, j),             (i, l, j, k),             (i, l, k, j),             (j, i, k, l),             (j, i, l, k),             (j, k, i, l),             (j, k, l, i),             (j, l, i, k),             (j, l, k, i),             (k, i, j, l),             (k, i, l, j),             (k, j, i, l),             (k, j, l, i),             (k, l, i, j),             (k, l, j, i),             (l, i, j, k),             (l, i, k, j),             (l, j, i, k),             (l, j, k, i),             (l, k, i, j),             (l, k, j, i),)            for i, j, k, l in c10_4 )        )      return list(ret)timing(init_set12, 1000)#该片段来自于http://byrx.net

评论关闭