Elements that smell funny:
Argument unpacking to itertools.product
.
Needing sorted keys (even though I don’t care about key order in the final result).
""" >>> d = {'A': [0, 1, 2], ... 'B': [3, 4], ... 'C': [5, 6, 7]} >>> for element in dict_product(d): ... print(element) {'A': 0, 'B': 3, 'C': 5} {'A': 0, 'B': 3, 'C': 6} {'A': 0, 'B': 3, 'C': 7} {'A': 0, 'B': 4, 'C': 5} {'A': 0, 'B': 4, 'C': 6} {'A': 0, 'B': 4, 'C': 7} {'A': 1, 'B': 3, 'C': 5} {'A': 1, 'B': 3, 'C': 6} {'A': 1, 'B': 3, 'C': 7} {'A': 1, 'B': 4, 'C': 5} {'A': 1, 'B': 4, 'C': 6} {'A': 1, 'B': 4, 'C': 7} {'A': 2, 'B': 3, 'C': 5} {'A': 2, 'B': 3, 'C': 6} {'A': 2, 'B': 3, 'C': 7} {'A': 2, 'B': 4, 'C': 5} {'A': 2, 'B': 4, 'C': 6} {'A': 2, 'B': 4, 'C': 7} """ from itertools import product def dict_product(d): sorted_keys = sorted(d.keys()) for element in product(*list(d[k] for k in sorted_keys)): yield dict(zip(sorted_keys, element)) if __name__ == "__main__": import doctest doctest.testmod(verbose=True)