from itertools import combinations, chain
 
def split_combinations(L):
    for split in range(1, len(L)):
        for combination in split_combinations(L[split:]):
            yield [L[:split]] + combination
    yield [L]
 
def split_combinations2(s):
    for i in range(len(s)):
        for split_points in combinations(range(1, len(s)), i):
            yield split_string(s, split_points)
 
def split_string(s, t):
    return [s[start:finish] for start, finish in zip((None, ) + t, t + (None, ))]
 
 
for test in 'abcd', 'abcde':
	print (list(split_combinations(test)))
	print (list(split_combinations2(test)))