Вы можете построить комбинации из 1, затем 2 ... n ваших наборов, и для каждой из этих комбинаций сгенерировать декартово произведение:
from itertools import product, combinations
sets = [
{"a1", "a2"}, #a set
{"b1", "b2"}, #b set
{"c1", "c2", "c3"} #c set
]
out = []
for size in range(1, len(sets)+1):
for combination in combinations(sets, r=size):
out.extend(set(p) for p in product(*combination))
print(out)
Выход:
[{'a2'}, {'a1'}, {'b1'}, {'b2'}, {'c2'}, {'c1'}, {'c3'},
{'b1', 'a2'}, {'b2', 'a2'}, {'b1', 'a1'}, {'b2', 'a1'}, {'c2', 'a2'},
{'c1', 'a2'}, {'c3', 'a2'}, {'c2', 'a1'}, {'c1', 'a1'}, {'c3', 'a1'},
{'b1', 'c2'}, {'b1', 'c1'}, {'b1', 'c3'}, {'c2', 'b2'}, {'c1', 'b2'},
{'b2', 'c3'},
{'b1', 'c2', 'a2'}, {'b1', 'c1', 'a2'}, {'b1', 'c3', 'a2'}, {'c2', 'b2', 'a2'},
{'c1', 'b2', 'a2'}, {'b2', 'c3', 'a2'}, {'b1', 'c2', 'a1'}, {'b1', 'c1', 'a1'},
{'b1', 'c3', 'a1'}, {'c2', 'b2', 'a1'}, {'c1', 'b2', 'a1'}, {'b2', 'c3', 'a1'}]