在python中生成字符串列表

2024-06-16 16:42:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我对python很陌生,所以我想试试这个快速脚本。。。在

给定一组输入词:例如“dead”、“beef”,如何以编程方式生成给定长度和填充字符的所有可能字符串?在

结果如下所示(使用0的焊盘,长度为12):

deadbeef0000
dead0beef000
dead00beef00
dead000beef0
dead0000beef
0deadbeef000
0dead0beef00
0dead00beef0
0dead000beef
00deadbeef00
00dead0beef0
00dead00beef
000deadbeef0
000dead0beef
0000deadbeef

生成此列表的简单方法可能是:

^{pr2}$

有没有更直接的方法?我已经研究过itertools的组合,但无法使其产生所需的结果。在


Tags: 方法字符串脚本列表编程方式字符dead
3条回答

假设,如您的示例所示,您希望“实词”以其原始顺序出现,则可以直接执行此操作(每个所需的输出字符串只生成一次,无需重复,也无需“剔除”无关的字符串)。每个单词需要一个“slot”,每个pad字符需要一个slot,其中pad字符的总数是指定的最终长度减去单词长度之和。在您的示例中,有两个长度为4的单词,总单词长度为8,因此每个输出字符串中需要12-8=4个填充字符。总共有6个插槽(2个用于单词,4个用于填充字符)。因此,输出字符串的总数为6-choose-2=6-choose-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)

然后:

^{pr2}$

显示所需的15个字符串。在

可能是这样的:

>>> 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评论

^{pr2}$

或者用更普遍的方式:

>>> 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)]
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 val

相关问题 更多 >