Наивный подход можно записать более компактно в виде выражения генератора:
((a,b,c) for a in [1,2,3] for b in [4,5,6,7,8,9] for c in [1,2])
Общий подход можно написать гораздо проще, используя рекурсивную функцию:
def combinations(*seqs):
if not seqs: return (item for item in ())
first, rest = seqs[0], seqs[1:]
if not rest: return ((item,) for item in first)
return ((item,) + items for item in first for items in combinations(*rest))
Пример использования:
>>> for pair in combinations('abc', [1,2,3]):
... print pair
...
('a', 1)
('a', 2)
('a', 3)
('b', 1)
('b', 2)
('b', 3)
('c', 1)
('c', 2)
('c', 3)