Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Cartesian product of a dictionary of lists as items [duplicate]

I have a dictionary in the following form:

{
    'variable_1': [a1, b1, c1],
    'variable_2': [a2, b2, c2],
    'variable_3': [a3, b3, c3],
    ...
}

(There are n entries in this dictionary).

I have a problem where I want to obtain all the possible combinations of the different values, for instance:

[(a1, a2, a3), (b1, a2, a3), (c1, a2, a3), (a1, b2, a3), ...]

I know this can be done with a cartesian product with itertools. However, I have noticed my problem would be much easier if the result was in the following form:

[{'variable1': a1, 'variable2':a2, 'variable3': a3}, {'variable1': b1, 'variable2':a2, 'variable3': a3}, ...]

Is there an easy way to do that?

like image 808
Eldy Avatar asked Oct 27 '25 11:10

Eldy


2 Answers

import itertools
d = {
'variable_1': ['a1', 'b1', 'c1'],
'variable_2': ['a2', 'b2', 'c2'],
'variable_3': ['a3', 'b3', 'c3'],
}


keys = (list(d.keys())) # ['variable_1', 'variable_2', 'variable_3']
values = (list(itertools.product(*(list(d.values()))))) #[('a1', 'a2', 'a3'), ('a1', 'a2', 'b3'), ('a1', 'a2', 'c3')...]

dictionary = []
for val in values:
    dictionary.append(dict(zip(keys, val)))

output:

[{'variable_1': 'a1', 'variable_2': 'a2', 'variable_3': 'a3'}, {'variable_1': 'a1', 'variable_2': 'a2', 'variable_3': 'b3'}, {'variable_1': 'a1', 'variable_2': 'a2', 'variable_3': 'c3'}, {'variable_1': 'a1', 'variable_2': 'b2', 'variable_3': 'a3'},...]

exapmle:

d = {
'variable_1': ['a1', 'b1', 'c1','d1'],
'variable_2': ['a2', 'b2', 'c2','d2'],
'variable_3': ['a3', 'b3', 'c3','d3'],
'variable_4': ['a3', 'b3', 'c3','d4'],
}

output:

[{'variable_1': 'a1', 'variable_2': 'a2', 'variable_3': 'a3', 'variable_4': 'a3'}, {'variable_1': 'a1', 'variable_2': 'a2', 'variable_3': 'a3', 'variable_4': 'b3'}, {'variable_1': 'a1', 'variable_2': 'a2', 'variable_3': 'a3', 'variable_4': 'c3'}, {'variable_1': 'a1', 'variable_2': 'a2', 'variable_3': 'a3', 'variable_4': 'd4'}, ...]
like image 101
ncica Avatar answered Oct 29 '25 23:10

ncica


You can also use a recursive function for a no-import solution:

def combo(data, c=[]):
  if not data:
    yield c
  else:
    for i in data[0]:
      yield from combo(data[1:], c+[i])

d = {'variable_1': ['a1', 'b1', 'c1'], 'variable_2': ['a2', 'b2', 'c2'], 'variable_3': ['a3', 'b3', 'c3']} 
keys, values = zip(*d.items())
result = [dict(zip(keys, i)) for i in combo(values)]

Output:

[{'variable_1': 'a1', 'variable_2': 'a2', 'variable_3': 'a3'}, {'variable_1': 'a1', 'variable_2': 'a2', 'variable_3': 'b3'}, {'variable_1': 'a1', 'variable_2': 'a2', 'variable_3': 'c3'}, {'variable_1': 'a1', 'variable_2': 'b2', 'variable_3': 'a3'}, {'variable_1': 'a1', 'variable_2': 'b2', 'variable_3': 'b3'}, {'variable_1': 'a1', 'variable_2': 'b2', 'variable_3': 'c3'}, {'variable_1': 'a1', 'variable_2': 'c2', 'variable_3': 'a3'}, {'variable_1': 'a1', 'variable_2': 'c2', 'variable_3': 'b3'}, {'variable_1': 'a1', 'variable_2': 'c2', 'variable_3': 'c3'}, {'variable_1': 'b1', 'variable_2': 'a2', 'variable_3': 'a3'}, {'variable_1': 'b1', 'variable_2': 'a2', 'variable_3': 'b3'}, {'variable_1': 'b1', 'variable_2': 'a2', 'variable_3': 'c3'}, {'variable_1': 'b1', 'variable_2': 'b2', 'variable_3': 'a3'}, {'variable_1': 'b1', 'variable_2': 'b2', 'variable_3': 'b3'}, {'variable_1': 'b1', 'variable_2': 'b2', 'variable_3': 'c3'}, {'variable_1': 'b1', 'variable_2': 'c2', 'variable_3': 'a3'}, {'variable_1': 'b1', 'variable_2': 'c2', 'variable_3': 'b3'}, {'variable_1': 'b1', 'variable_2': 'c2', 'variable_3': 'c3'}, {'variable_1': 'c1', 'variable_2': 'a2', 'variable_3': 'a3'}, {'variable_1': 'c1', 'variable_2': 'a2', 'variable_3': 'b3'}, {'variable_1': 'c1', 'variable_2': 'a2', 'variable_3': 'c3'}, {'variable_1': 'c1', 'variable_2': 'b2', 'variable_3': 'a3'}, {'variable_1': 'c1', 'variable_2': 'b2', 'variable_3': 'b3'}, {'variable_1': 'c1', 'variable_2': 'b2', 'variable_3': 'c3'}, {'variable_1': 'c1', 'variable_2': 'c2', 'variable_3': 'a3'}, {'variable_1': 'c1', 'variable_2': 'c2', 'variable_3': 'b3'}, {'variable_1': 'c1', 'variable_2': 'c2', 'variable_3': 'c3'}]
like image 20
Ajax1234 Avatar answered Oct 30 '25 00:10

Ajax1234



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!