How can I make a list of dictionaries according to the Cartesian product of values in a source dictionary ("explode" the dictionary)?

Question:

Given a dictionary that looks like this:

{
    'Color': ['Red', 'Yellow'],
    'Size': ['Small', 'Medium', 'Large']
}

How can I create a list of dictionaries that combines the various values of the first dictionary’s keys? What I want is:

[
    {'Color': 'Red', 'Size': 'Small'},
    {'Color': 'Red', 'Size': 'Medium'},
    {'Color': 'Red', 'Size': 'Large'},
    {'Color': 'Yellow', 'Size': 'Small'},
    {'Color': 'Yellow', 'Size': 'Medium'},
    {'Color': 'Yellow', 'Size': 'Large'}
]
Asked By: user1272534

||

Answers:

I think you want the Cartesian product, not a permutation, in which case itertools.product can help:

>>> from itertools import product
>>> d = {'Color': ['Red', 'Yellow'], 'Size': ['Small', 'Medium', 'Large']}
>>> [dict(zip(d, v)) for v in product(*d.values())]
[{'Color': 'Red', 'Size': 'Small'}, {'Color': 'Red', 'Size': 'Medium'}, {'Color': 'Red', 'Size': 'Large'}, {'Color': 'Yellow', 'Size': 'Small'}, {'Color': 'Yellow', 'Size': 'Medium'}, {'Color': 'Yellow', 'Size': 'Large'}]
Answered By: DSM

You can obtain that result doing this:

x={'Color': ['Red', 'Yellow'], 'Size': ['Small', 'Medium', 'Large']}
keys=x.keys()
values=x.values()

matrix=[]
for i in range(len(keys)):
     cur_list=[]
     for j in range(len(values[i])):
             cur_list.append({keys[i]: values[i][j]})
     matrix.append(cur_list)

y=[]
for i in matrix[0]:
     for j in matrix[1]:
             y.append(dict(i.items() + j.items()))

print y

result:

[{'Color': 'Red', 'Size': 'Small'}, {'Color': 'Red', 'Size': 'Medium'}, {'Color': 'Red', 'Size': 'Large'}, {'Color': 'Yellow', 'Size': 'Small'}, {'Color': 'Yellow', 'Size': 'Medium'}, {'Color': 'Yellow', 'Size': 'Large'}]
Answered By: sissi_luaty
Categories: questions Tags: ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.