¿Cómo obtener todas las asignaciones entre dos listas?

Tenemos dos listas, A y B:

A = ['a','b','c'] B = [1, 2] 

¿Hay alguna forma en la que los conjuntos de mapas entre A y B contengan 2 ^ n (aquí 2 ^ 3 = 8)? Es decir:

 [(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)] 

Usando itertools.product , es posible obtener todas las tuplas:

 import itertools as it P = it.product(A, B) [p for p in P] 

Lo que da:

 Out[3]: [('a', 1), ('a', 2), ('b', 1), ('b', 2), ('c', 1), ('c', 2)] 

Puedes hacerlo con itertools.product y zip

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

Salida

 [[('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)) produce

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

Luego, seleccionamos cada elemento del producto y lo comprimimos con A , para obtener el resultado deseado.

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

salidas:

 [('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)] 

No estoy seguro de si es muy pythonic, lo es si lo it.product(*([B]*len(A))) , porque usa múltiples funciones de lenguaje específicas de python. Pero en realidad es demasiado críptico para ser pythonic … B se repite n veces en función de la longitud de A y se desempaqueta en función del producto.