In [223]:
# find unique non-contiguous subsets of a list
def subSegment(patterns, span, positions, segments, loop=0, level=0):
    if level < span:
        for loop in range(level, len(patterns)):
            # a stack of positions
            positions.append(loop)
            # recursive call
            segments = subSegment(patterns, span, positions, segments, loop+1, level+1)
    else:
        segment = [p for p in positions]
        # if no duplicates in the segment
        if len(list(set(segment))) == len(segment):
            duplicate = False
            # if no duplicates among segments
            for s in segments:
                if set(segment).issubset(set(s)):
                    duplicate = True
                    break
            
            if not duplicate:    # ignore duplicates
                segments.append(segment)

    if positions:
        positions.pop()

    return segments

In [272]:
# find all non-contiguous subsets of a numerical series
series = list(range(0, 5))
span = int(len(series)/2)

count = 0
for s in range(1, span+1):
    print ('\nspan:', s)
    segments = subSegment(series, s, [], [])
    count += len(segments)
    print ([(s,list(set(series).difference(s))) for s in segments])
        
print ('count:', count)


span: 1
[([0], [1, 2, 3, 4]), ([1], [0, 2, 3, 4]), ([2], [0, 1, 3, 4]), ([3], [0, 1, 2, 4]), ([4], [0, 1, 2, 3])]

span: 2
[([0, 1], [2, 3, 4]), ([0, 2], [1, 3, 4]), ([0, 3], [1, 2, 4]), ([0, 4], [1, 2, 3]), ([1, 2], [0, 3, 4]), ([1, 3], [0, 2, 4]), ([1, 4], [0, 2, 3]), ([2, 3], [0, 1, 4]), ([2, 4], [0, 1, 3]), ([3, 4], [0, 1, 2])]
count: 15

In [ ]:
# range:counts -> 5:15, 6:41, 7:63, 8:162, 9:255, 10:637