如何优雅的生成“指定长度”的“指定字符集”的所有字符串?

2016-01-18 23:18:21 +08:00
 abelyao

可能问题有点绕,题目不描述,举个例子:

如果指定长度为 3 而字符集为 abc,那就生成 aaa, aab, aac, aba ... ccc
如果指定长度为 4 而字符集为 abcdefg,那就按顺序生成 aaaa ... gggg

显然套 for 循环的话就没办法动态长度了,那么还有啥优雅的方法来实现吗?递归?
脑海中有那个大概思路,但写出来结果都不对…
干脆就不要脸一点… 能不能直接来段代码…

4191 次点击
所在节点    问与答
30 条回复
windfarer
2016-01-18 23:26:45 +08:00
隐约记得 Python cookbook 里有
sensui7
2016-01-18 23:26:54 +08:00
这不就是排列组合问题吗?
yiaya
2016-01-18 23:43:56 +08:00
第一反应是在生成密码字典。。。
lxy42
2016-01-18 23:46:45 +08:00
python itertools 模块中有排列组合的函数
lxy42
2016-01-18 23:49:02 +08:00
补充,官方文档中介绍很详细,另外还有纯 python 实现的代码。
Bryan0Z
2016-01-18 23:51:57 +08:00
歪个楼,写个 26 进制转换函数,事先计算几位会数到多少,然后十进制一一数过去,转换成二十六进制,别打我
认真说: 递归
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 肯定更优雅
TJT
2016-01-19 00:00:03 +08:00
imgalaxy
2016-01-19 00:04:08 +08:00
canautumn
2016-01-19 00:04:47 +08:00
递归最优雅。不想用递归就把递归用 Stack 改写成循环。
just1
2016-01-19 00:18:04 +08:00
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
其实我是搬运工 逃:)
abelyao
2016-01-19 00:30:02 +08:00
@yiaya 其实是想生成批量查域名的组合…
msg7086
2016-01-19 02:45:37 +08:00
Ruby:

input = 'abcdefg'
length = 4
input.each_char.to_a.repeated_combination(length).map(&:join)
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"]
msg7086
2016-01-19 02:49:33 +08:00
input.chars.repeated_combination(length).map(&:join)

这样更简单些。
Elethom
2016-01-19 07:49:21 +08:00
@msg7086
Ruby 竟然連這種 func 都有。長姿勢了。
virusdefender
2016-01-19 09:13:53 +08:00
burpsuite 自带
flyee
2016-01-19 09:16:42 +08:00
itertools.product('abc', repeat=3)
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))
windfarer
2016-01-19 09:47:23 +08:00
囧,缩进没了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/251705

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX