es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Realice itertools.product permitiendo un número diferente de repeticiones para diferentes iterables.

Supongamos que tengo dos iterables A = 'ab' y B = '12'.

itertools.product devuelve un iterador que generará el producto cartesiano de A y B; por ejemplo:

>>> list(itertools.product(A,B)) 
[('a', '1'), ('a', '2'), ('b', '1'), ('b', '2')].

La función tiene un argumento opcional de palabra clave repeat, que se puede utilizar para encontrar el producto cartesiano de un iterable consigo mismo; por ejemplo:

>>> list(itertools.product(A,repeat=2))
[('a', 'a'), ('a', 'b'), ('b', 'a'), ('b', 'b')]

y es equivalente a list(itertools.product(A,A)).

Luego, utilizando repeat=2 y tanto A como B, se obtiene:

>>> list(itertools.product(A,B,repeat=2))
[('a', '1', 'a', '1'), ('a', '1', 'a', '2'), ('a', '1', 'b', '1'), ('a', '1', 'b', '2'), ('a', '2', 'a', '1'), ('a', '2', 'a', '2'), ('a', '2', 'b', '1'), ('a', '2', 'b', '2'), ('b', '1', 'a', '1'), ('b', '1', 'a', '2'), ('b', '1', 'b', '1'), ('b', '1', 'b', '2'), ('b', '2', 'a', '1'), ('b', '2', 'a', '2'), ('b', '2', 'b', '1'), ('b', '2', 'b', '2')]

y es equivalente a list(itertools.product(A,B,A,B)).

Pero ahora supongamos que quiero encontrar el producto cartesiano de n_A repeticiones de A y n_B repeticiones de B, donde n_A y n_B no tienen que ser iguales. ¿Cómo puedo hacer esto? Sería genial si repeat aceptara la tupla (n_A, n_B) y pudiera escribir:

list(itertools.product(A,B,repeat=(n_A,n_B)))

por ejemplo:

list(itertools.product(A,B,repeat=(2,3))) == list(itertools.product(A,A,B,B,B))

pero esto no parece estar permitido.

Ten en cuenta que técnicamente (A,A,B,B,B) es un producto diferente a (A,B,A,B,B), sin embargo, de todas formas ordenaré las salidas, así que no me importa el orden de los datos de entrada.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para encontrar la combinación cartesiana de n_A repeticiones de A y n_B repeticiones de B, puedes utilizar la comprensión de listas dentro de itertools.product. Crea una lista de iterables que contenga n_A copias de A y n_B copias de B, y pasa esta lista como argumento *iterables a itertools.product. Así es como puedes hacerlo:

    import itertools
    
    n_A = 2
    n_B = 3
    iterables = [A]*n_A + [B]*n_B
    resultado = list(itertools.product(*iterables))
    

    Esto te dará el mismo resultado que list(itertools.product(A,A,B,B,B)), pero sin tener que codificar las iterables individuales. Puedes cambiar fácilmente los valores de n_A y n_B para generar diferentes productos.

    Ten en cuenta que el operador * se utiliza para desempaquetar la lista de iterables en argumentos separados para itertools.product. Esto se debe a que product acepta argumentos variables, mientras que pasar una lista de iterables como un único argumento resultará en una combinación cartesiana de los elementos de la lista, en lugar de los iterables individuales en sí.

Comments are closed.