我想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
之后的句子末尾出现因为在主句中没有单词跟随。
答案 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']]