token_list = ['a', 'b', 'c'] contradictions = { 'a': set(['b']), 'b': set(['a']), 'c': set() } def solve(tokens, contradictions): if not tokens: yield set() else: tokens = set(tokens) t = tokens.pop() for solution in solve(tokens - contradictions[t], contradictions): yield solution | set([t]) if contradictions[t] & tokens: for solution in solve(tokens, contradictions): if contradictions[t] & solution: yield solution print list(solve(token_list, contradictions))