You can achieve what you want with dynamic programming.
The following code creates all combinations of words of length less or equal to 20:
words = ['Lorem', 'ipsum', 'dolor', 'sit', 'amet', 'consectetur', 'adipiscing', 'elit']
def disjoint(a, b):
for i in a:
if i in b:
return False
return True
r = [[] for _ in range(21)]
for i, w in enumerate(words):
r[len(w)].append([i])
for i in range(21):
for j in range(i):
for a in r[j]:
for b in r[i - j]:
if disjoint(a, b):
r[i].append(a + b)
answer = [" ".join([words[i] for i in s]) for s in r[20]]
r[i]
represents all possible combinations of words of length i
(each word of the initial list words
is represented by its index), and is constructed recursively. The function disjoint
is here to prevent the repetition of the same word in a combination.
answer
in the end is the following list:
['amet Lorem consectetur',
'amet ipsum consectetur',
'amet dolor consectetur',
'amet consectetur Lorem',
'amet consectetur ipsum',
'amet consectetur dolor',
'elit Lorem consectetur',
'elit ipsum consectetur',
'elit dolor consectetur',
'elit consectetur Lorem',
'elit consectetur ipsum',
'elit consectetur dolor',
'Lorem amet consectetur',
'Lorem elit consectetur',
'Lorem ipsum adipiscing',
'Lorem dolor adipiscing',
'Lorem adipiscing ipsum',
'Lorem adipiscing dolor',
'Lorem consectetur amet',
'Lorem consectetur elit',
'ipsum amet consectetur',
'ipsum elit consectetur',
'ipsum Lorem adipiscing',
'ipsum dolor adipiscing',
'ipsum adipiscing Lorem',
'ipsum adipiscing dolor',
'ipsum consectetur amet',
'ipsum consectetur elit',
'dolor amet consectetur',
'dolor elit consectetur',
'dolor Lorem adipiscing',
'dolor ipsum adipiscing',
'dolor adipiscing Lorem',
'dolor adipiscing ipsum',
'dolor consectetur amet',
'dolor consectetur elit',
'amet Lorem consectetur',
'amet ipsum consectetur',
'amet dolor consectetur',
'elit Lorem consectetur',
'elit ipsum consectetur',
'elit dolor consectetur',
'Lorem amet consectetur',
'Lorem elit consectetur',
'ipsum amet consectetur',
'ipsum elit consectetur',
'dolor amet consectetur',
'dolor elit consectetur',
'adipiscing Lorem ipsum',
'adipiscing Lorem dolor',
'adipiscing ipsum Lorem',
'adipiscing ipsum dolor',
'adipiscing dolor Lorem',
'adipiscing dolor ipsum',
'Lorem ipsum adipiscing',
'Lorem dolor adipiscing',
'ipsum Lorem adipiscing',
'ipsum dolor adipiscing',
'dolor Lorem adipiscing',
'dolor ipsum adipiscing',
'consectetur amet Lorem',
'consectetur amet ipsum',
'consectetur amet dolor',
'consectetur elit Lorem',
'consectetur elit ipsum',
'consectetur elit dolor',
'consectetur Lorem amet',
'consectetur Lorem elit',
'consectetur ipsum amet',
'consectetur ipsum elit',
'consectetur dolor amet',
'consectetur dolor elit',
'amet consectetur Lorem',
'amet consectetur ipsum',
'amet consectetur dolor',
'elit consectetur Lorem',
'elit consectetur ipsum',
'elit consectetur dolor',
'Lorem adipiscing ipsum',
'Lorem adipiscing dolor',
'ipsum adipiscing Lorem',
'ipsum adipiscing dolor',
'dolor adipiscing Lorem',
'dolor adipiscing ipsum',
'adipiscing Lorem ipsum',
'adipiscing Lorem dolor',
'adipiscing ipsum Lorem',
'adipiscing ipsum dolor',
'adipiscing dolor Lorem',
'adipiscing dolor ipsum',
'consectetur amet Lorem',
'consectetur amet ipsum',
'consectetur amet dolor',
'consectetur elit Lorem',
'consectetur elit ipsum',
'consectetur elit dolor',
'Lorem consectetur amet',
'Lorem consectetur elit',
'ipsum consectetur amet',
'ipsum consectetur elit',
'dolor consectetur amet',
'dolor consectetur elit',
'consectetur Lorem amet',
'consectetur Lorem elit',
'consectetur ipsum amet',
'consectetur ipsum elit',
'consectetur dolor amet',
'consectetur dolor elit']