Python 句子中词的递归排列

Python 句子中词的递归排列,python,recursion,permutation,sentence,Python,Recursion,Permutation,Sentence,我想递归地得到句子中单词的排列,将相邻的单词分成两组,从左到右排列在一起 例如,如果我认为 A、B、C、D < /代码>是4个单词,主句子有5个出现的4个词为: 主句:a+B+c+a+D 我会得到四个句子作为答案 c + a + B + c + a a + B + c + a + D a + B + c + a + B B + c + a + B + c 它们的长度都与主句相同,应该注意的是,主句中的最后一个单词,即D只出现一次,并且只出现在a之后的句子末尾,因为在主句中没有单词跟在后面。可以

我想递归地得到句子中单词的排列,将相邻的单词分成两组,从左到右排列在一起

例如,如果我认为<代码> A、B、C、D < /代码>是4个单词,主句子有5个出现的4个词为:

主句:
a+B+c+a+D

我会得到四个句子作为答案

c + a + B + c + a
a + B + c + a + D
a + B + c + a + B
B + c + a + B + c

它们的长度都与主句相同,应该注意的是,主句中的最后一个单词,即
D
只出现一次,并且只出现在
a
之后的句子末尾,因为在主句中没有单词跟在后面。

可以使用带递归的生成器:

s = ['a', 'B', 'c', 'a', 'D']
def combinations(d, _c = []):
  if len(_c) == len(d)+1:
     yield _c
  else:
     for i in d:
       if not _c or any(s[c] == _c[-1] and s[c+1] == i for c in range(len(s)-1)):
          for k in combinations(d, _c+[i]):
            yield k

print('\n'.join(' + '.join(i) for i in combinations(set(s))))
输出:

a + B + c + a + B
a + B + c + a + D
B + c + a + B + c
c + a + B + c + a

可以使用以下递归生成器函数:

def adjacent_combinations(sentence, target=None, length=0):
    if not target:
        for target in set(sentence):
            for combination in adjacent_combinations(sentence, target, 1):
                yield combination
    elif length == len(sentence):
        yield [target]
    else:
        for a, b in set(zip(sentence, sentence[1:])):
            if a == target:
                for combination in adjacent_combinations(sentence, b, length + 1):
                    yield [a] + combination
以便:

list(adjacent_combinations(['a', 'B', 'c', 'a', 'D']))
将返回:

[['B', 'c', 'a', 'B', 'c'],
 ['c', 'a', 'B', 'c', 'a'],
 ['a', 'B', 'c', 'a', 'B'],
 ['a', 'B', 'c', 'a', 'D']]

你提到你想要一个递归的解决方案,然后你提到一个非递归的解决方案。您使用的是哪种方法?我将删除第二种方法-让我们递归求解:)是否允许重复相同的相邻单词对?如果不是,
c+a+B+c+a
不应出现在预期输出中。@B如果是,则允许,只要最后一句与主句长度相同。因此,上面的主句只有上面给出的4个可接受的结果。聪明的一个,但输出是不正确的,如果你注意到我上面写的,只有从左到右相邻的单词才能在一起,例如,在你的输出“c”中,“a”是不允许的,因为在s中“c”后面从来没有“a”,而且输出的句子长度也应该与主句相同,即你的句子长度为4s@Soyol在所需输出的每个序列中,字母数为5。同样,在你的问题中,在
B+c+a+B+c
中,“c”后面跟着“a”。你能澄清一下吗?很抱歉我说了两个字,但引用是主句,即
a+B+c+a+D
,我们希望得到这个句子的排列,并尊重这样一个事实,即从左到右相邻的单词仍然相邻,最后的排列结果与引用长度相同sentence@Soyol请看我最近的编辑。现在,每一个都与
['a','B','c','a','D']
进行比较。现在您有了额外的输出,例如'a','a'不允许在一起,因为在主句中,决不允许与'a'相邻。此外,不允许使用“a”“c”,因为在主句中,“c”“a”仅发生。正如我提到的,应该遵循从左到右的邻接方向,即在置换中允许使用“c”“a”,但不允许使用“a”“c”。相比之下,给出了超过最大递归深度的错误,而且在python Oops中也不起作用。我确实输入了一个错误。我还更新了我的答案,不使用来自的
收益率。请现在再试一次。您的代码有一个角落,因为句子“a”+“b”打印为空,而句子“a”+“a”+“a”打印为8次“a”+“a”+“a”。那就修好了。请现在重试。对于句子“a”+“a”+“a”仍然打印4次“a”+“a”+“a”