Elements that smell funny: argument unpacking to itertools.product
. I'm 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)
map(dict, product(*[[(k, v) for v in vv] for k, vv in d.items()]))
\$\endgroup\$