Вы можете использовать следующую функцию рекурсивного генератора:
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']]