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.

Para generar una lista, permitiendo duplicados y cumpliendo una condición.

De las opciones [1,2,3], quiero mostrar todas las posibles combinaciones, permitiendo duplicados en las opciones, en una lista de 5 elementos.

En cada una de las listas, debe haber al menos un 1, al menos un 2 y al menos un 3.

Una forma torpe como la siguiente. Primero genera una lista de 5 usando uno de [1,2,3]. Todas las listas generadas se examinan para asegurarse de que haya al menos un [1,2,3]. Las que cumplen los requisitos se colocan en una gran lista. Luego, se eliminan los duplicados en la gran lista (iterando muchas veces para garantizar una buena cobertura):

import random
import itertools

opciones = [1,2,3]

gran_lista = []

for a in range(10000):
nueva_lista = [random.choice(opciones) for i in range(5)]

if nueva_lista.count(1) >= 1 and nueva_lista.count(2) >= 1 and nueva_lista.count(3) >= 1:
    gran_lista.append(nueva_lista)

gran_lista.sort()

lista_final = list(gran_lista for gran_lista, _ in itertools.groupby(gran_lista))

esta línea elimina los duplicados en la lista de listas

print(lista_final)

Considerando que la secuencia importa, es decir, [1,1,1,2,3] y [2,3,1,1,1] son dos listas diferentes.

¿Cuál sería la forma más inteligente y completa de hacerlo?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Una forma más eficiente y completa de generar todas las posibles combinaciones asegurando al menos una ocurrencia de cada elemento en la lista sería utilizando la función product del módulo itertools con un parámetro de repetición de 5. La función product genera todos los posibles productos cartesianos a partir de la lista dada de elementos, y el parámetro de repetición especifica el número de veces que cada elemento puede repetirse en la salida.

    Para asegurar que al menos una ocurrencia de cada elemento esté presente en la salida, podemos combinar la función product con una comprensión de listas que filtre cualquier combinación que no contenga al menos una ocurrencia de cada elemento.

    Así es como se vería el código:

    import itertools
    
    choices = [1, 2, 3]
    combinations = list(itertools.product(choices, repeat=5))
    
    valid_combinations = [c for c in combinations if set(c) == set(choices)]
    

    En el código anterior, itertools.product(choices, repeat=5) genera todas las posibles combinaciones de choices con una longitud de 5, incluyendo duplicados.

    La comprensión de lista [c for c in combinations if set(c) == set(choices)] filtra cualquier combinación que no contenga al menos una ocurrencia de cada elemento en choices. Utilizamos la función set para eliminar duplicados de la combinación y la comparamos con el set de choices.

    La lista resultante valid_combinations contiene todas las posibles combinaciones de [1, 2, 3] con longitud 5, con al menos una ocurrencia de cada elemento.

Comments are closed.