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.

¿Qué está mal con esta comprensión de lista?

Tengo listA=[[0,1],[1,2]], y listB=[[0,1,2],[0,1,3],[0,2,3],[0,2,4]].
Quiero encontrar todos los elementos b de listB tales que b⊆a no sea verdadero y a⊆b no sea verdadero para todos los elementos a de listA. Dicho de otra manera, mi resultado deseado es: listC=[[0,2,3],[0,2,4]].

Intenté los siguientes códigos:

import numpy as np

listA=[[0,1],[1,2]]
listB=[[0,1,2],[0,1,3],[0,2,3],[0,2,4]]

listC=[b for b in listB if (((not set(a).issubset(set(b))) and (not set(b).issubset(set(a)))) for a in listA)]
print(listC)

Sin embargo, la salida es [[0,1,2],[0,1,3],[0,2,3],[0,2,4]], que no es lo que quiero. Supongo que hay algo mal en la parte del if de la comprensión de lista. ¿Cómo se puede solucionar? Gracias.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    El problema con tu código es que estás utilizando una expresión generadora dentro de tu comprensión de lista, lo que no devuelve el valor booleano correcto. En su lugar, puedes utilizar un bucle anidado para iterar a través de ambas listas y verificar la condición para cada elemento. Aquí tienes un ejemplo de código que debería darte la salida deseada:

    listA=[[0,1],[1,2]]
    listB=[[0,1,2],[0,1,3],[0,2,3],[0,2,4]]
    
    listC=[]
    for b in listB:
        flag=True
        for a in listA:
            if set(b).issubset(set(a)) or set(a).issubset(set(b)):
                flag=False
                break
        if flag:
            listC.append(b)
    
    print(listC)
    

    Este código primero inicializa una lista vacía listC para almacenar la salida deseada. Luego, itera a través de cada elemento b en listB y establece una bandera en True. A continuación, itera a través de cada elemento a en listA y verifica si b es un subconjunto de a o si a es un subconjunto de b. Si cualquiera de estas condiciones es verdadera, establece la bandera en False y sale del bucle. Si la bandera todavía es True después de comprobar todos los elementos de listA, agrega b a listC. Finalmente, imprime listC, que debería ser [[0, 2, 3], [0, 2, 4]].

Comments are closed.