我对python很陌生,所以我想我可以尝试一下这个快速的脚本.
给定一组输入词:即“死”、“牛肉”,如何以编程方式生成所有可能的给定长度和填充字符的字符串?
结果如下所示(使用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的组合,但无法获得所需的结果。
发布于 2014-01-04 03:07:10
假设,如您的示例所示,您希望“真正的单词”以其原始顺序出现,则可以直接完成(每个所需的输出字符串只生成一次,不需要重复,也不需要“清除”多余的字符串)。每个单词需要一个“插槽”,每个衬垫字符需要一个插槽,其中pad字符的总数是指定的最终长度减去单词长度的总和。在您的示例中,您有两个长度为4的单词,总单词长度为8,因此在每个输出字符串中需要12-8 =4个pad字符。这总共提供了6个插槽(2个字和4个衬垫字符)。输出字符串的总数因此是6-选择-2=6-选择-4= 6*5/2 = 15。这也解释了如何使用itertools.combinations来获得结果:从所有插槽索引集合中选择两个单词的索引,或者--等效地-从所有插槽索引集合中选择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个字符串。
发布于 2014-01-04 02:36:25
也许是这样:
>>> from itertools import permutations
>>> lst = ['dead', 'beef', '0', '0', '0', '0']
>>> for i in set(permutations(lst)):
... ''.join(i)
...
'beefdead0000'
'dead0beef000'
'dead000beef0'
'00dead0beef0'
'0beef000dead'
...编辑:以下@TimPeters评论
>>> [''.join(i) for i in set(permutations(lst))
if i.index('dead') < i.index('beef')]或者以更普遍的方式:
>>> real_words = ['dead', 'beef']
>>> padding = 4
>>> [''.join(i) for i in set(permutations(real_words + ['0'] * padding))
if reduce(lambda x,y: i.index(x) < i.index(y), real_words)]发布于 2014-01-04 02:38:36
for x in range(0, 5):
pre = '0' * x
for y in range(0, 5-x):
mid = '0' * y
z = 5 - x - y
post = '0' * z
val = pre + 'dead' + mid + 'beef' + post
print valhttps://stackoverflow.com/questions/20916072
复制相似问题