可能问题有点绕,题目不描述,举个例子:
如果指定长度为 3
而字符集为 abc
,那就生成 aaa
, aab
, aac
, aba
... ccc
;
如果指定长度为 4
而字符集为 abcdefg
,那就按顺序生成 aaaa
... gggg
;
显然套 for
循环的话就没办法动态长度了,那么还有啥优雅的方法来实现吗?递归?
脑海中有那个大概思路,但写出来结果都不对…
干脆就不要脸一点… 能不能直接来段代码…
1
windfarer 2016-01-18 23:26:45 +08:00 via Android
隐约记得 Python cookbook 里有
|
2
sensui7 2016-01-18 23:26:54 +08:00
这不就是排列组合问题吗?
|
3
yiaya 2016-01-18 23:43:56 +08:00 via Android
第一反应是在生成密码字典。。。
|
4
lxy42 2016-01-18 23:46:45 +08:00
python itertools 模块中有排列组合的函数
|
5
lxy42 2016-01-18 23:49:02 +08:00
补充,官方文档中介绍很详细,另外还有纯 python 实现的代码。
|
6
Bryan0Z 2016-01-18 23:51:57 +08:00 via Android
歪个楼,写个 26 进制转换函数,事先计算几位会数到多少,然后十进制一一数过去,转换成二十六进制,别打我
认真说: 递归 |
7
TJT 2016-01-18 23:58:46 +08:00
def fuckingfuck(maxLen, charSet, currStr):
if (len(currStr) == maxLen): print(currStr); return; for i in charSet: oldStr = currStr; currStr += i; fuckingfuck(maxLen, charSet, currStr); currStr = oldStr; fuckingfuck(3, 'abcde', ''); 换成 lambda 肯定更优雅 |
8
TJT 2016-01-19 00:00:03 +08:00
|
9
imgalaxy 2016-01-19 00:04:08 +08:00 via Android
|
10
canautumn 2016-01-19 00:04:47 +08:00
递归最优雅。不想用递归就把递归用 Stack 改写成循环。
|
11
just1 2016-01-19 00:18:04 +08:00 via Android
z2 = []
def perm( teams, k, m ): global z2 if k > m: z2.append( tuple(teams) ) return else: for i in xrange( k, m+1 ): teams[k], teams[i] = teams[i], teams[k] perm( teams, k+1, m ) teams[k], teams[i] = teams[i], teams[k] return if __name__ == '__main__': teams = list( 'abc' ) m = len( teams ) perm( teams, 0, m-1 ) print z2 其实我是搬运工 逃:) |
13
msg7086 2016-01-19 02:45:37 +08:00
Ruby:
input = 'abcdefg' length = 4 input.each_char.to_a.repeated_combination(length).map(&:join) |
14
msg7086 2016-01-19 02:48:37 +08:00
# => ["aaaa", "aaab", "aaac", "aaad", "aaae", "aaaf", "aaag", "aabb", "aabc", "aabd", "aabe", "aabf", "aabg", "aacc", "aacd", "aace", "aacf", "aacg", "aadd", "aade", "aadf", "aadg", "aaee", "aaef", "aaeg", "aaff", "aafg", "aagg", "abbb", "abbc", "abbd", "abbe", "abbf", "abbg", "abcc", "abcd", "abce", "abcf", "abcg", "abdd", "abde", "abdf", "abdg", "abee", "abef", "abeg", "abff", "abfg", "abgg", "accc", "accd", "acce", "accf", "accg", "acdd", "acde", "acdf", "acdg", "acee", "acef", "aceg", "acff", "acfg", "acgg", "addd", "adde", "addf", "addg", "adee", "adef", "adeg", "adff", "adfg", "adgg", "aeee", "aeef", "aeeg", "aeff", "aefg", "aegg", "afff", "affg", "afgg", "aggg", "bbbb", "bbbc", "bbbd", "bbbe", "bbbf", "bbbg", "bbcc", "bbcd", "bbce", "bbcf", "bbcg", "bbdd", "bbde", "bbdf", "bbdg", "bbee", "bbef", "bbeg", "bbff", "bbfg", "bbgg", "bccc", "bccd", "bcce", "bccf", "bccg", "bcdd", "bcde", "bcdf", "bcdg", "bcee", "bcef", "bceg", "bcff", "bcfg", "bcgg", "bddd", "bdde", "bddf", "bddg", "bdee", "bdef", "bdeg", "bdff", "bdfg", "bdgg", "beee", "beef", "beeg", "beff", "befg", "begg", "bfff", "bffg", "bfgg", "bggg", "cccc", "cccd", "ccce", "cccf", "cccg", "ccdd", "ccde", "ccdf", "ccdg", "ccee", "ccef", "cceg", "ccff", "ccfg", "ccgg", "cddd", "cdde", "cddf", "cddg", "cdee", "cdef", "cdeg", "cdff", "cdfg", "cdgg", "ceee", "ceef", "ceeg", "ceff", "cefg", "cegg", "cfff", "cffg", "cfgg", "cggg", "dddd", "ddde", "dddf", "dddg", "ddee", "ddef", "ddeg", "ddff", "ddfg", "ddgg", "deee", "deef", "deeg", "deff", "defg", "degg", "dfff", "dffg", "dfgg", "dggg", "eeee", "eeef", "eeeg", "eeff", "eefg", "eegg", "efff", "effg", "efgg", "eggg", "ffff", "fffg", "ffgg", "fggg", "gggg"]
|
15
msg7086 2016-01-19 02:49:33 +08:00
input.chars.repeated_combination(length).map(&:join)
这样更简单些。 |
17
virusdefender 2016-01-19 09:13:53 +08:00
burpsuite 自带
|
18
flyee 2016-01-19 09:16:42 +08:00
itertools.product('abc', repeat=3)
|
19
windfarer 2016-01-19 09:46:22 +08:00
from itertools import combinations_with_replacement
text = 'abcdef' for c in combinations_with_replacement(text, 3): print(''.join(c)) |
20
windfarer 2016-01-19 09:47:23 +08:00
囧,缩进没了
|
21
Arthur2e5 2016-01-19 12:25:43 +08:00
@windfarer 快用 python with braces (逃
然后日常 bash 实现: https://gist.github.com/Arthur2e5/4c3950c8f012d1d4ae62#file-foo-bash |
23
abelyao OP |
26
lululau 2016-01-19 17:47:04 +08:00
perl -le 'print for "aaa".."zzz"'
|
27
lululau 2016-01-19 17:47:41 +08:00
ruby -e '("aaa".."zzz").each { |x| puts x}'
|
28
lululau 2016-01-19 17:49:25 +08:00 1
ruby -e 'puts [*"aaa".."zzz"]'
|