How to get all mappings between two lists? How to get all mappings between two lists? python python

How to get all mappings between two lists?


You can do this with itertools.product and zip

from itertools import productprint [zip(A, item) for item in product(B, repeat=len(A))]

Output

[[('a', 1), ('b', 1), ('c', 1)], [('a', 1), ('b', 1), ('c', 2)], [('a', 1), ('b', 2), ('c', 1)], [('a', 1), ('b', 2), ('c', 2)], [('a', 2), ('b', 1), ('c', 1)], [('a', 2), ('b', 1), ('c', 2)], [('a', 2), ('b', 2), ('c', 1)], [('a', 2), ('b', 2), ('c', 2)]]

product(B, repeat=len(A)) produces

[(1, 1, 1), (1, 1, 2), (1, 2, 1), (1, 2, 2), (2, 1, 1), (2, 1, 2), (2, 2, 1), (2, 2, 2)]

Then we pick each element from the product and zip it with A, to get your desired output.


import itertools as itA = ['a','b','c']B = [1, 2]for i in it.product(*([B]*len(A))):    print(list(zip(A, i)))

outputs:

[('a', 1), ('b', 1), ('c', 1)][('a', 1), ('b', 1), ('c', 2)][('a', 1), ('b', 2), ('c', 1)][('a', 1), ('b', 2), ('c', 2)][('a', 2), ('b', 1), ('c', 1)][('a', 2), ('b', 1), ('c', 2)][('a', 2), ('b', 2), ('c', 1)][('a', 2), ('b', 2), ('c', 2)]

Not sure if it's very pythonic, it is if you look at it.product(*([B]*len(A))), because it uses multiple python-specific language features. But it's actually too cryptic to be pythonic... B is repeated n-times based on length of A and unpacked to the product-function.