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)
In [ ]:
# range:counts -> 5:15, 6:41, 7:63, 8:162, 9:255, 10:637