
可能问题有点绕,题目不描述,举个例子:
如果指定长度为 3 而字符集为 abc,那就生成 aaa, aab, aac, aba ... ccc;
如果指定长度为 4 而字符集为 abcdefg,那就按顺序生成 aaaa ... gggg;
显然套 for 循环的话就没办法动态长度了,那么还有啥优雅的方法来实现吗?递归?
脑海中有那个大概思路,但写出来结果都不对…
干脆就不要脸一点… 能不能直接来段代码…
1 windfarer 2016 年 1 月 18 日 via Android 隐约记得 Python cookbook 里有 |
2 sensui7 2016 年 1 月 18 日 这不就是排列组合问题吗? |
3 yiaya 2016 年 1 月 18 日 via Android 第一反应是在生成密码字典。。。 |
4 lxy42 2016 年 1 月 18 日 python itertools 模块中有排列组合的函数 |
5 lxy42 2016 年 1 月 18 日 补充,官方文档中介绍很详细,另外还有纯 python 实现的代码。 |
6 Bryan0Z 2016 年 1 月 18 日 via Android 歪个楼,写个 26 进制转换函数,事先计算几位会数到多少,然后十进制一一数过去,转换成二十六进制,别打我 认真说: 递归 |
7 TJT 2016 年 1 月 18 日 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 年 1 月 19 日 |
9 imgalaxy 2016 年 1 月 19 日 via Android |
10 canautumn 2016 年 1 月 19 日 递归最优雅。不想用递归就把递归用 Stack 改写成循环。 |
11 just1 2016 年 1 月 19 日 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 年 1 月 19 日 Ruby: input = 'abcdefg' length = 4 input.each_char.to_a.repeated_combination(length).map(&:join) |
14 msg7086 2016 年 1 月 19 日 # => ["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 年 1 月 19 日 input.chars.repeated_combination(length).map(&:join) 这样更简单些。 |
17 virusdefender 2016 年 1 月 19 日 burpsuite 自带 |
18 flyee 2016 年 1 月 19 日 itertools.product('abc', repeat=3) |
19 windfarer 2016 年 1 月 19 日 from itertools import combinations_with_replacement text = 'abcdef' for c in combinations_with_replacement(text, 3): print(''.join(c)) |
20 windfaer 2016 年 1 月 19 日 ,缩进没了 |
21 Arthur2e5 2016 年 1 月 19 日 @windfarer 快用 python with braces (逃 然后日常 bash 实现: https://gist.github.com/Arthur2e5/4c3950c8f012d1d4ae62#file-foo-bash |
23 abelyao OP |
26 lululau 2016 年 1 月 19 日 perl -le 'print for "aaa".."zzz"' |
27 lululau 2016 年 1 月 19 日 ruby -e '("aaa".."zzz").each { |x| puts x}' |
28 lululau 2016 年 1 月 19 日 ruby -e 'puts [*"aaa".."zzz"]' |