Вы можете перебирать список, отсортированный по длинам фраз в обратном порядке, и добавлять каждую возможную подфразу в набор, так что вы можете использовать этот набор, чтобы проверить, является ли текущая фраза подфразапредыдущая, более длинная фраза:
output = []
seen = set()
for phrase in sorted(l, key=len, reverse=True):
words = tuple(phrase.split())
if words not in seen:
output.append(phrase)
seen.update({words[i: i + n + 1] for n in range(len(words)) for i in range(len(words) - n)})
так что дано:
l = ['love', 'hair', 'light', 'hair dryer', 'bright light', 'bright hair dryer']
output
становится:
['bright hair dryer', 'bright light', 'love']