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.