Cómo obtener la máxima cantidad de tuplas que aún no están contenidas en otro conjunto?
Dado una lista de letras, digamos L=[‘a’,’b’,’c’,’d’,’e’,’f’] y una lista de tuplas, por ejemplo T=[(‘a’,’b’),(‘a’,’c’),(‘b’,’c’)].
Ahora quiero crear la máxima cantidad de posibles tuplas a partir de la lista L que no estén contenidas en T. Esto debe hacerse sin duplicados, es decir, (a,b) sería lo mismo que (b,a). Además, cada letra solo puede estar emparejada una vez con otra letra.
Mi idea era:
crear una lista de todas las posibles tuplas primero:
all_tuples = [(x,y) for x in L for y in L if x!=y]
ahora eliminar duplicados
unique_tuples = list(set([tuple(sorted(elem)) for elem in all_tuples]))
Ahora, crear un nuevo conjunto que empareje cada letra solo una vez con otra letra
visited=set()
output = []
for letter1, letter2 in unique_tuples:
if ((letter1, letter2) or (letter2, letter1)) in T:
continue
if not letter1 in visited and not letter2 in visited:
visited.add(letter1)
visited.add(letter2)
output.append((letter1,letter2))
print(output)
Sin embargo, esto no siempre da la máxima cantidad de posibles tuplas, dependiendo de lo que sea T. Por ejemplo, digamos que extraemos las posibles unique_tuples=[(‘a’,’b’),(‘a’,’d’),(‘b’,’c’)].
Si agregamos (‘a’,’b’) primero a nuestra salida, ya no podemos agregar (‘b’,’c’), ya que ‘b’ ya ha sido emparejado. Sin embargo, si agregamos (‘a’,’d’) primero, también podríamos obtener (‘b’,’c’) después y obtener la máxima cantidad de dos tuplas.
¿Cómo se puede resolver esto?
davy.ai
Una posible solución para asegurar obtener la cantidad máxima de tuplas es utilizar una función recursiva que verifique todas las combinaciones posibles de tuplas que no violen las condiciones (que no estén contenidas en T y que no haya letras duplicadas). Comenzando con una lista de salida vacía, la función puede agregar cada tupla posible y llamarse a sí misma recursivamente con las tuplas restantes hasta que se hayan verificado todas las combinaciones posibles. Luego, la función puede devolver la combinación con el mayor número de tuplas.
Aquí hay un ejemplo de implementación de esta función recursiva:
Para usar esta función con las listas de ejemplo L y T de la pregunta, podemos llamarla:
Esto mostrará en pantalla la combinación con el máximo número de tuplas posibles: [(‘a’, ‘d’), (‘b’, ‘c’)].