def unique_combinations(number_letter_dict): def _unique_combinations(index): if index == size: yield () return number, letters = number_letters[index] for letter in letters: if letter not in used_letters: used_letters.add(letter) for combination in _unique_combinations(index + 1): yield [number, letter], *combination used_letters.remove(letter) number_letters = list(number_letter_dict.items()) size = len(number_letters) used_letters = set() return list(_unique_combinations(0)) number_letter_dict = {1: ['a', 'b', 'c'], 2: ['c', 'd'], 3: ['b', 'c']} print(unique_combinations(number_letter_dict))
Standard input is empty
[([1, 'a'], [2, 'c'], [3, 'b']), ([1, 'a'], [2, 'd'], [3, 'b']), ([1, 'a'], [2, 'd'], [3, 'c']), ([1, 'b'], [2, 'd'], [3, 'c']), ([1, 'c'], [2, 'd'], [3, 'b'])]