crommy
crommy

Reputation: 493

Creating all possible combinations from two arrays

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

Answers (4)

Sayandip Dutta
Sayandip Dutta

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

fixmycode
fixmycode

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

bootica
bootica

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

megges
megges

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

Related Questions