Вы можете использовать рекурсию с генератором:
def combo(d):
yield d
if len(d) > 1:
for i in range(len(d)-1):
yield from combo([*d[:i], d[i]+d[i+1], *d[i+2:]])
print(list(set(map(tuple, combo(["a", "b", "c", "d"])))))
Выход:
[('a', 'b', 'c', 'd'), ('abcd',), ('ab', 'c', 'd'), ('abc', 'd'), ('a', 'b', 'cd'), ('ab', 'cd'), ('a', 'bcd'), ('a', 'bc', 'd')]