比这篇新的文章: aa
比这篇旧的文章: python.普通 IP 转换为十进制 IP

生成四位不重复数字(0-9)的所有组合

语言: Python, 标签: 代码优化 排列 2008/06/22发布 5个月前更新
作者: onenew, 点击683次, 评论(5), 收藏者(1)

开关行号, 全选(Ctrl+C复制) | 一键复制:HTML, BBCode(Discuz!) , 源代码 | 查看:裸代码, 全屏
背景
主题: 字体:
Python语言: 生成四位不重复数字(0-9)的所有组合
001 #coding=cp936
002 #关于这个问题的精彩讨论参见这里
003 #  http://groups.google.com/group/python-cn/browse_thread/thread/4d9eda8e422a6cf8
004
005 #在我的电脑上
006 #init_set 1000 times 5.529
007 #init_set2 1000 times 4.674
008 #init_set3 1000 times 3.287
009 #init_set4 1000 times 18.271
010 #init_set5 1000 times 2.069
011
012 def init_set8(r10=range(10)):
013     """
014     把循环内的range函数提到外面
015     times5.486 ==> 4.427
016     """
017     ret = []
018     for i in r10:
019         for j in r10:
020             for k in r10:
021                 for l in r10:
022                     if i != j and i != k and i != l and j != k and j != l and k != l:
023                         ret.append((i, j, k, l))
024     return ret
025 timing(init_set8, 1000)
026 def init_set9(r10=range(10)):
027     """
028     for 循环改成列表推导
029     times5.486 ==>3.773
030     """
031     return [(i, j, k, l)
032         for i in r10
033         for j in r10
034         for k in r10
035         for l in r10
036         if ( i != j and i != k and i != l and j != k and j != l and k != l) ]
037 timing(init_set9, 1000)
038
039 def init_set10(r10=range(10)):
040     """
041     return 一个 generator
042     init_set10 1000 times 0.004
043     这个无疑是最快的 :P
044     我最喜欢这个解决方案,空间换时间的算法
045     对这个问题属于 过度优化
046     """
047     return ((i, j, k, l)
048             for i in r10
049             for j in r10
050             for k in r10
051             for l in r10
052             if( i != j and i != k and i != l and j != k and j != l and k != l) )
053 timing(init_set10, 1000)
054
055 def init_set11():
056     """
057     用代码的空间代价换取计算P4_4的时间
058     init_set11 1000 times 7.268 OMG
059     reduce(lambda x,y:x+y,l)太慢了
060     """
061     c10_4=[( i, j, k, l ) for i in xrange(0, 10)
062                           for j in xrange(i+1, 10)
063                           for k in xrange(j+1, 10)
064                           for l in xrange(k+1, 10) ]
065
066     ret=reduce(lambda x,y:x+y,
067             [ [ (i, j, k, l),
068                 (i, j, l, k),
069                 (i, k, j, l),
070                 (i, k, l, j),
071                 (i, l, j, k),
072                 (i, l, k, j),
073                 (j, i, k, l),
074                 (j, i, l, k),
075                 (j, k, i, l),
076                 (j, k, l, i),
077                 (j, l, i, k),
078                 (j, l, k, i),
079                 (k, i, j, l),
080                 (k, i, l, j),
081                 (k, j, i, l),
082                 (k, j, l, i),
083                 (k, l, i, j),
084                 (k, l, j, i),
085                 (l, i, j, k),
086                 (l, i, k, j),
087                 (l, j, i, k),
088                 (l, j, k, i),
089                 (l, k, i, j),
090                 (l, k, j, i),]
091                 for i, j, k, l in c10_4 ],
092             )
093     return ret
094
095 def init_set12():
096     """
097     generator是伟大的发明,数据流编程万岁
098     init_set12 1000 times 1.758
099     """
100     c10_4=(( i, j, k, l ) for i in xrange(0, 10)
101             for j in xrange(i+1, 10)
102             for k in xrange(j+1, 10)
103             for l in xrange(k+1, 10) )
104
105     from  itertools import chain
106     ret=chain(
107         *( ( (i, j, k, l),
108              (i, j, l, k),
109              (i, k, j, l),
110              (i, k, l, j),
111              (i, l, j, k),
112              (i, l, k, j),
113              (j, i, k, l),
114              (j, i, l, k),
115              (j, k, i, l),
116              (j, k, l, i),
117              (j, l, i, k),
118              (j, l, k, i),
119              (k, i, j, l),
120              (k, i, l, j),
121              (k, j, i, l),
122              (k, j, l, i),
123              (k, l, i, j),
124              (k, l, j, i),
125              (l, i, j, k),
126              (l, i, k, j),
127              (l, j, i, k),
128              (l, j, k, i),
129              (l, k, i, j),
130              (l, k, j, i),)
131             for i, j, k, l in c10_4 )
132         ) 
133     return list(ret)
134 timing(init_set12, 1000)
打分:

所有评论,共5条:( 我也来说两句)

1
半瓶墨水 5个月前 回复
0
0
抛砖引玉引来了流星火雨,OMG!
  
2
onenew 5个月前 回复
0
0
其实我想在Gmail上贴彩色代码
不过没找到怎么直接贴 html  
3
半瓶墨水 5个月前 回复
0
0
直接copy & Paste不行吗?我都是这么干的,Gmail是可以的啊。
4
半瓶墨水 4个月前 回复
0
0
能够给这个代码加上“猜数字”标签吗?
这样的话到这里就能看到所有有关的结果了:
http://www.fayaa.com/code/tag/%E7%8C%9C%E6%95%B0%E5%AD%97/
  
5
半瓶墨水 4个月前 回复
0
0
试试URL的显示:
http://www.fayaa.com/code/
Django的urlize好像有问题

发表评论

注册登录后再发表评论