首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在python中生成字符串列表

在python中生成字符串列表
EN

Stack Overflow用户
提问于 2014-01-04 02:22:56
回答 5查看 570关注 0票数 2

我对python很陌生,所以我想我可以尝试一下这个快速的脚本.

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

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

代码语言:javascript
复制
deadbeef0000
dead0beef000
dead00beef00
dead000beef0
dead0000beef
0deadbeef000
0dead0beef00
0dead00beef0
0dead000beef
00deadbeef00
00dead0beef0
00dead00beef
000deadbeef0
000dead0beef
0000deadbeef

生成此列表的天真方法可能是:

代码语言:javascript
复制
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的组合,但无法获得所需的结果。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 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个衬垫字符的索引。这里的代码是前者:

代码语言:javascript
复制
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)

然后:

代码语言:javascript
复制
for s in get_strings(["dead", "beef"], "0", 12):
    print s

显示所需的15个字符串。

票数 4
EN

Stack Overflow用户

发布于 2014-01-04 02:36:25

也许是这样:

代码语言:javascript
复制
>>> 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评论

代码语言:javascript
复制
>>> [''.join(i) for i in set(permutations(lst)) 
                                        if i.index('dead') < i.index('beef')]

或者以更普遍的方式:

代码语言:javascript
复制
>>> 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)]
票数 6
EN

Stack Overflow用户

发布于 2014-01-04 02:38:36

代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20916072

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档