Three possible way to create all subsets of a given set is shown below:
1. Using Binary:
2. Recursive:
3. Iterative:
1. Using Binary:
lst = ['a', 'b', 'c', 'd', 'e'] def interpret_combination(s): s = s[::-1] #reversing the string to match the index positions with the given list if not '1' in list(s): # all zeros return [] else: indices_of_ones = [i for i, x in enumerate(list(s)) if x == '1'] # find the indices of 1s only l = list(s) #convert to list as you can't operate on strings for item in indices_of_ones: l[item] = lst[item] # replace the one's with the characters on the list l = [x for x in l if x != '0'] # replace the zeros return ''.join(map(str, l)) # join them to make a string again all_subsets = [] for i in xrange(2 ** len(lst)): # until 2^(lenght of list) l1 = len(str(bin(i))[2:]) # binary representation without the preceding 0b l2 = len(lst) s = (l2 - l1)*'0' + str(bin(i))[2:] # prepending the zeros in front to make it more readable all_subsets.append(interpret_combination(s)) print all_subsets
2. Recursive:
def adder(elem, elem_set): # copy elem with each element of elem_set exp_lst = [] for item in elem_set: exp_lst.append(elem + item) return exp_lst def all_subsets(s): if len(s) is 0: return '' elif len(s) is 1: return ['', s[0]] else: return all_subsets(s[:-1]) + adder(s[len(s)-1], all_subsets(s[:-1])) print all_subsets(['a','b', 'c', 'd'])
3. Iterative:
lst = ['a', 'b', 'c', 'd', 'e']
sub_arr = []
sub_arr_tmp = []
for item in lst:
for elem in sub_arr:
sub_arr_tmp.append([item + elem])
sub_arr.append(item)
if len(sub_arr_tmp) is 0:
sub_arr.append('')
else:
for e in sub_arr_tmp:
if(isinstance(e, list)):
sub_arr.append(e[0])
del sub_arr_tmp[:]
print set(sub_arr)
print len(set(sub_arr))
No comments:
Post a Comment