String Python连接字符串以生成字符串中所有单词的组合

String Python连接字符串以生成字符串中所有单词的组合,string,python-3.x,join,combinations,String,Python 3.x,Join,Combinations,如果我的字符串是:“这是一个字符串”,如何通过将每个单词与其相邻的单词连接起来来生成所有可能的组合 此输出将是什么样的: this is a string thisis a string thisisa string thisisastring thisis astring this isa string this isastring this is astring 我所尝试的: s = 'this is a string'.split() for i, l in enumerate(

如果我的字符串是:
“这是一个字符串”
,如何通过将每个单词与其相邻的单词连接起来来生成所有可能的组合

此输出将是什么样的:

this is a string
thisis a string
thisisa string
thisisastring
thisis astring
this isa string
this isastring
this is astring
我所尝试的:

s = 'this is a string'.split()    
for i, l in enumerate(s):
        ''.join(s[0:i])+' '.join(s[i:])
这将产生:

'this is a string'
'thisis a string'
'thisisa string'
'thisisastring'

我意识到我需要更改
s[0:I]
部分,因为它静态地锚定在0,但我不知道如何移动到下一个单词
is
,同时仍然在输出中包含

最简单的方法是递归执行

  • 终止条件:单个元素列表的薛定谔连接就是这个词
  • 循环条件:假设L是除第一个单词外所有单词的薛定谔连接。然后,列表的薛定谔连接由L中的所有元素和L中的所有元素组成,L中的所有元素和L中的第一个单词都有一个中间空格
(假设您丢失了
这是偶然的。如果是故意的,我肯定不知道问题是什么:p)


另一种非递归方法是枚举从
0
2^(字数-1)-1
的所有数字,然后使用每个数字的二进制表示形式作为选择器,无论是否需要存在空格。因此,例如,上面提到的
这是astring
对应于
0b010
,表示“nospace,space,nospace”。

嗯,我花了比我预期的稍长的时间。。。这其实比我想象的还要狡猾:)

主要思想是:

拆分字符串时的空格数为长度或拆分数组-1。在我们的示例中,有3个空格:

'this is a string'
     ^  ^ ^
我们将采用所有选项的二进制表示形式,其中包含/不包含任何一个空格,因此在我们的示例中,它将是:

000
001
011
100
101
...
对于每个选项,我们将分别
生成
句子,其中111表示所有3个空格:“这是一个字符串”,000表示完全没有空格:“这是一个字符串”

def binaries(n):
    res = []
    for x in range(n ** 2 - 1):
        tmp = bin(x)
        res.append(tmp.replace('0b', '').zfill(n))
    return res


def generate(arr, bins):
    res = []
    for bin in bins:
        tmp = arr[0]
        i = 1
        for digit in list(bin):
            if digit == '1':
                tmp = tmp + " " + arr[i]
            else:
                tmp = tmp + arr[i]
            i += 1
        res.append(tmp)
    return res


def combinations(string):
    s = string.split(' ')
    bins = binaries(len(s) - 1)
    res = generate(s, bins)
    return res


print combinations('this is a string')
# ['thisisastring', 'thisisa string', 'thisis astring', 'thisis a string', 'this isastring', 'this isa string', 'this is astring', 'this is a string']
更新:
我现在看到阿玛丹也想到了同样的想法——这是因为他比我想得快!英雄所见略同;)

您还可以使用:

使用itertools产品的一种更简单(比公认答案快3倍)的方法:

s = 'this is a string'
s2 = s.replace('%', '%%').replace(' ', '%s')
for i in itertools.product((' ', ''), repeat=s.count(' ')):
    print(s2 % i)

你说得对,我确实错过了
这是astring
。谢谢你的帮助。我用这个更正更新了我的问题。我会花一些时间来内化如何应用你的评论,阿玛丹。非常酷!我投了赞成票。但是我不理解这部分内容。
.replace(“%”,“%%”)
。这对我来说似乎是多余的。@tommy.carstensen-escape%字符如果它们恰好在原始字符串中,以准备进一步的格式操作请参阅@panda-34提供的更快的解决方案。
s = 'this is a string'
s2 = s.replace('%', '%%').replace(' ', '%s')
for i in itertools.product((' ', ''), repeat=s.count(' ')):
    print(s2 % i)