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