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.

Genera en Python combinaciones de n elementos de una lista tomados de r en r y verifica el cumplimiento de las restricciones.

Supongamos que tenemos la siguiente lista que representa IDs de candidatos:

candidates = list(range(1,37))

Me gustaría generar, en un tiempo computacional asequible, una lista que contenga 6 listas de tuplas, que son las combinaciones de estos 36 candidatos tomados de 6 en 6, sin que ningún candidato coincida con otro candidato en cualquiera de las listas anteriores.

resul = []

Consideremos un ejemplo. La primera combinación válida se puede obtener de la siguiente manera:

ex1 = [(1, 2, 3, 4, 5, 6), (7, 8, 9, 10, 11, 12), (13, 14, 15, 16, 17, 18), 
(19, 20, 21, 22, 23, 24), (25, 26, 27, 28, 29, 30), (31, 32, 33, 34, 35, 36)]

Entonces, podemos agregar ex1 a la lista:

resul.append(ex1)

Ahora me gustaría comenzar a generar combinaciones, por ejemplo, ex2 sería una combinación válida, ya que no se repiten elementos en cada tupla de la lista de tuplas de resul:

ex2 = [(1, 8, 18, 23, 28, 33), (3, 7, 14, 24, 29, 34), (4, 9, 13, 20, 30, 35),
(5, 10, 15, 19, 26, 36), (6, 11, 16, 21, 25, 32), (2, 12, 17, 22, 27, 31)]

Entonces, ex2 también se puede agregar:

resul.append(ex2)

Otro caso, ex3, no se podría agregar, ya que el 1 y el 5 ya están juntos en la primera tupla del primer elemento de la lista (ex1):

ex3 = [(1, 12, 5, 25, 30, 35), ..., ..., ..., ..., ...]

Entonces, como mencioné, me gustaría obtener solo 6 elementos que cumplan con las restricciones anteriores y para esto me gustaría saber cómo generar estas combinaciones de 36 elementos tomados de a 6 y verificar el cumplimiento de las restricciones.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para generar las combinaciones deseadas, podemos utilizar la función combinations del módulo itertools en Python. Esta función genera todas las combinaciones posibles de longitud 6 a partir de la lista dada de 36 candidatos. Podemos utilizar esta función para generar combinaciones y luego verificar si los ID de los candidatos ya están presentes en las listas anteriores de tuplas.

    Un enfoque para verificar la viabilidad de una combinación generada es iterar sobre cada tupla en las listas anteriores de tuplas en resul y verificar si los ID de los candidatos en la tupla actual no se repiten. La siguiente función implementa este enfoque y devuelve solo las combinaciones viables:

    import itertools
    
    def generate_combinations():
        candidates = list(range(1, 37))
        resul = []
        for comb in itertools.combinations(candidates, 6):
            # verificar si la combinación actual es viable
            viable = True
            for l in resul:
                for tup in l:
                    if set(comb).intersection(set(tup)):
                        viable = False
                        break
                if not viable:
                    break
            if viable:
                # si es viable, agregar la tupla a la lista de tuplas
                l = list(comb)
                ex = [tuple(l[i:i+6]) for i in range(0, len(l), 6)]
                resul.append(ex)
            # parar de generar combinaciones cuando obtengamos 6 listas viables
            if len(resul) == 6:
                break
        return resul
    

    Comenzamos inicializando una lista vacía resul para contener las combinaciones viables. Luego utilizamos un bucle for para generar todas las combinaciones de longitud 6 a partir de la lista de candidatos. Para cada combinación generada, verificamos si es viable iterando sobre las listas anteriores de tuplas en resul y verificando si los ID de los candidatos en la tupla actual no se repiten. Si la combinación es viable, la convertimos en una lista y luego en una lista de tuplas de longitud 6. Finalmente, agregamos esta lista de tuplas a resul. También dejamos de generar más combinaciones una vez que obtengamos 6 listas viables.

    Al ejecutar la función generate_combinations(), debería devolver una lista que contiene 6 listas viables de tuplas, sin que ningún candidato coincida con otro candidato en ninguna de las listas anteriores.

Comments are closed.