Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

199
Views
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 answers
Answer question

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 Report

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!