我是python的新手,所以我想为这个快速脚本做个尝试...
给定一组输入词:即“ dead”,“ beef”,一个人如何以编程方式生成给定长度和填充字符的所有可能字符串?
结果看起来像这样(使用填充0
长度为12的填充):
deadbeef0000
dead0beef000
dead00beef00
dead000beef0
dead0000beef
0deadbeef000
0dead0beef00
0dead00beef0
0dead000beef
00deadbeef00
00dead0beef0
00dead00beef
000deadbeef0
000dead0beef
0000deadbeef
生成此列表的幼稚方法可能是:
for x in range(0, 5):
pre = '0' * x
for y in range(0, 5):
mid = '0' * y
for z in range (0, 5):
post = '0' * z
val = pre + 'dead' + mid + 'beef' + post
if len(val) == 12:
print val
有没有更直接的方法?我已经研究itertools
了组合,但无法获得所需的结果。
假设如您的示例所示,您希望“真实词”以其原始顺序出现,那么可以直接完成此操作(每个所需的输出字符串仅生成一次,没有重复,也不需要“清除”多余的字符串) 。每个单词需要一个“插槽”,每个填充字符需要一个插槽,其中填充字符的总数是指定的最终长度减去单词长度的总和。在您的示例中,您有两个长度为4的单词,总单词长度为8,因此每个输出字符串中需要12-8 = 4个填充字符。这总共提供6个插槽(2个用于单词,4个用于填充字符)。因此,输出字符串的总数为6选择2 = 6选择4 = 6 * 5/2 =15。这也说明了如何使用itertools.combinations
要获得结果,请执行以下操作:从所有插槽索引的集合中选择2个单词的索引,或者-等价地-从所有插槽索引的集合中选择4个填充字符的索引。这里的代码执行前者:
def get_strings(words, pad, length):
from itertools import combinations
nwords = len(words)
npad = length - sum(len(word) for word in words)
nslots = nwords + npad
for ix in combinations(range(nslots), nwords):
result = [pad] * nslots
i = 0
for j in ix:
result[j] = words[i]
i += 1
yield "".join(result)
然后:
for s in get_strings(["dead", "beef"], "0", 12):
print s
显示您想要的15个字符串。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句