Here is what I came up with:
from itertools import permutations, combinations, ifilter, chain people = [1,2,3,4,5,6,7,8,9] #get all combinations of 3 sets of 3 people combos_combos = combinations(combinations(people,3), 3) #filter out sets that don't contain all 9 people valid_sets = ifilter(lambda combo: len(set(chain.from_iterable(combo))) == 9, combos_combos) #a set of people that have already been paired already_together = set() for sets in valid_sets: #get all (sorted) combinations of pairings in this set pairings = list(chain.from_iterable(combinations(combo, 2) for combo in sets)) pairings = set(map(tuple, map(sorted, pairings))) #if all of the pairings have never been paired before, we have a new one if len(pairings.intersection(already_together)) == 0: print sets already_together.update(pairings)
Fingerprints:
~$ time python test_combos.py ((1, 2, 3), (4, 5, 6), (7, 8, 9)) ((1, 4, 7), (2, 5, 8), (3, 6, 9)) ((1, 5, 9), (2, 6, 7), (3, 4, 8)) ((1, 6, 8), (2, 4, 9), (3, 5, 7)) real 0m0.182s user 0m0.164s sys 0m0.012s