Reputation: 493
I'm trying to think of an efficient way of solving the following problem:
Given any two arrays 'a' and 'b' I'd like to create all lists of combinations, each combination should contain tuples of one element from 'a' and one element from 'b'
for example:
a = ['p', 'q'], b = [True, False]
the output should be the following:
[{'p': False, 'q': False}, {'p': False, 'q': True}, {'p': True, 'q':
False}, {'p': True, 'q': True}]
Upvotes: 2
Views: 1021
Reputation: 15872
from itertools import product
lst = [dict(zip(a,pair)) for pair in product(b,b)]
Output:
[{'p': True, 'q': True},
{'p': True, 'q': False},
{'p': False, 'q': True},
{'p': False, 'q': False}]
EDIT:
Since you say a
can be of any length, in that case you don't really need b
.
from itertools import permutations
import numpy as np
a = ['p','q','r','s','t']
list1 = list(permuations(a))
set1 = {tuple(np.array(a) == np.array(i)) for i in list1}
final_list = [dict(zip(a,i)) for i in set1]
Output:
[{'p': True, 'q': False, 'r': False, 's': False, 't': False},
{'p': True, 'q': False, 'r': True, 's': True, 't': False},
{'p': False, 'q': False, 'r': False, 's': False, 't': True},
{'p': True, 'q': False, 'r': True, 's': False, 't': False},
{'p': False, 'q': False, 'r': True, 's': True, 't': True},
{'p': True, 'q': False, 'r': False, 's': True, 't': False},
{'p': False, 'q': False, 'r': False, 's': True, 't': True},
{'p': False, 'q': False, 'r': True, 's': False, 't': True},
{'p': False, 'q': True, 'r': False, 's': False, 't': False},
{'p': False, 'q': True, 'r': True, 's': True, 't': False},
{'p': False, 'q': True, 'r': False, 's': True, 't': False},
{'p': False, 'q': True, 'r': True, 's': False, 't': False},
{'p': True, 'q': True, 'r': True, 's': False, 't': False},
{'p': True, 'q': True, 'r': False, 's': True, 't': False},
{'p': True, 'q': True, 'r': False, 's': False, 't': False},
{'p': True, 'q': True, 'r': False, 's': False, 't': True},
{'p': True, 'q': False, 'r': False, 's': True, 't': True},
{'p': True, 'q': False, 'r': True, 's': False, 't': True},
{'p': False, 'q': False, 'r': False, 's': True, 't': False},
{'p': False, 'q': False, 'r': True, 's': False, 't': False},
{'p': True, 'q': False, 'r': False, 's': False, 't': True},
{'p': False, 'q': False, 'r': False, 's': False, 't': False},
{'p': False, 'q': False, 'r': True, 's': True, 't': False},
{'p': False, 'q': True, 'r': False, 's': True, 't': True},
{'p': False, 'q': True, 'r': True, 's': False, 't': True},
{'p': True, 'q': True, 'r': True, 's': True, 't': True},
{'p': False, 'q': True, 'r': False, 's': False, 't': True}]
Upvotes: 0
Reputation: 8506
from itertools import product
dicts = [{k:v for k,v in zip(keys, tup)} for tup in list(product(values, repeat=len(keys)))]
Upvotes: 3
Reputation: 771
a = ['p', 'q']
b = [True, False]
import itertools
result = [{values[0]: values[1]} for values in list(itertools.product(a,b))]
print(result)
is that what you need?
Upvotes: 1
Reputation: 640
Hey you can use itertools.product with repeat=2
Here is a working example which builds a list of dictionaries
[{k1:v1, k2:v2} for k1,v1,k2,v2 in itertools.product(a,b,repeat=2) if k1 != k2]
Upvotes: 4