Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

200
Vistas
Problemas para imprimir una expresión generadora como una lista

Estoy tratando de devolver los valores de todas las hojas en un árbol binario con un generador y pongo los valores obtenidos en una lista. Este es mi código recursivo que usa declaraciones de rendimiento, pero no sé cómo devolver los valores finales con un generador. El segundo fragmento de código titulado "Código anterior" muestra el mismo código con declaraciones de impresión que genera los valores correctos, por lo que el único problema es el generador. Como nota, este código usa root.left y root.right importados de una clase de árbol binario y parece funcionar correctamente. ¡¡Gracias de antemano por cualquier ayuda!!

Mi código

 def leaves_list(self): def find(root): if not root: yield if not root.left and not root.right: yield root.data if root.left: find(root.left) if root.right: find(root.right) # my attempt a = find(self.root) lst = [] for i in a: lst.append(next(a)) return find(self.root)

Código anterior

 def leaves_list(self): def find(root): if not root: return if not root.left and not root.right: print(root.data, end = " ") return if root.left: find(root.left) if root.right: find(root.right) return find(self.root)

Este es mi código de prueba y debería devolver la lista [5, 1, 8, 4] .

Código del probador

 root = LinkedBinaryTree.Node(3) T = LinkedBinaryTree(root) a = LinkedBinaryTree.Node(2) a.parent = root root.left = a b = LinkedBinaryTree.Node(7) b.parent = root root.right = b c = LinkedBinaryTree.Node(9) c.parent = a a.left = c d = LinkedBinaryTree.Node(5) d.parent = c c.left = d e = LinkedBinaryTree.Node(1) e.parent = c c.right = e f = LinkedBinaryTree.Node(8) f.parent = b b.left = f g = LinkedBinaryTree.Node(4) g.parent = b b.right = g print(T.leaves_list())
over 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

Hay algunos problemas con su intento:

  • find(self.root) se llama dos veces. Esto no debería ser necesario ya que hará el trabajo dos veces para obtener el mismo resultado nuevamente.

  • lst se crea y se llena, pero nunca se usa. Probablemente deberías devolverlo.

  • No consuma un iterador con un bucle for y con llamadas repetidas a next() . Cuando lo hace, en realidad pasa al siguiente valor dos veces en cada iteración, omitiendo así un valor en cada iteración.

  • Considere también que la función de list estándar ya tiene esta función de crear una lista a partir de un iterador.

  • En la función de find , no está haciendo nada con los valores generados por la llamada recursiva. Deberías cederlas también. Puede usar el yield from la sintaxis para eso.

  • if not root no funcionará correctamente cuando el árbol esté realmente vacío, ya que la ejecución aún continúa después de ese bloque if , por lo que se generará una excepción. Necesitas un return allí.

  • Además, cuando el árbol está vacío, no debería haber nada que se produzca. Se permite que un iterador simplemente no produzca nada, lo cual es apropiado en ese caso.

  • No hay problema, pero dado que tiene if not root como caso base, realmente no necesita verificar None antes de ir a la izquierda o a la derecha. Entonces, esas condiciones if se pueden eliminar y las llamadas recursivas se pueden hacer incondicionalmente.

Aquí está la versión corregida:

 def leaves_list(self): def find(root): if not root: return if not root.left and not root.right: yield root.data yield from find(root.left) yield from find(root.right) return list(find(self.root))
over 4 years ago · Santiago Trujillo Denunciar

0

# my attempt a = find(self.root) lst = [] for i in a: lst.append(i) return lst

Una alternativa más corta:

 # my attempt return list(find(self.root))
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda