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)))