句子中单词的递归排列

时间:2018-09-30 02:46:23

标签: python recursion permutation sentence

我想recursively获得句子中单词的排列,将相邻单词从左到右以两个为一包。

例如,如果我认为a, B, c, D是4个单词,并且主句中有4个单词中有5个出现为:

主要句子: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之后的句子末尾出现因为在主句中没有单词跟随。

2 个答案:

答案 0 :(得分:1)

您可以将生成器与递归一起使用:

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

答案 1 :(得分:1)

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

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']]