operaciones - sentencias python
¿Cómo obtener todas las asignaciones entre dos listas? (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.
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)]
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 si es muy pythonic, 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.