def nontrivialgroup(g): if g[0] == [] or g[1] == []: return False return True def group(xs): result = [[[xs[0]], []], [[], [xs[0]]]] for i in xs[1:]: newresult = [] for r in result: newresult.append([r[0] + [i], r[1]]) newresult.append([r[0], r[1] + [i]]) result = newresult[:] return filter(nontrivialgroup, result) def options(xs): if len(xs) == 1: return [(xs[0], str(xs[0]))] result = set() for g in group(xs): for a in options(g[0]): for b in options(g[1]): result.add((a[0] + b[0], "(" + str(a[1]) + "+" + str(b[1]) + ")")) result.add((a[0] - b[0], "(" + str(a[1]) + "-" + str(b[1]) + ")")) result.add((a[0] * b[0], "(" + str(a[1]) + "*" + str(b[1]) + ")")) if b[0] != 0: result.add((float(a[0]) / b[0], "(" + str(a[1]) + "/" + str(b[1]) + ")")) return result def f(xs): unduplicate = {} for i in list(options(xs)): unduplicate.update({i[0] : i[1]}) for n, x in unduplicate.iteritems(): if n - int(n) < 0.001: print str(int(n)) + " = " + x # Example: f([3,3,7,7])