Playground - Implementación de una queue
Clase 55 de 56 • 21 Días de Python
Contenido del curso
Paola Alapizco
Francisco Jesús Eslava Fernández
CARLOS ALBERTO MARTINEZ SANCHEZ
Diego Cruz
Brayan Estiben Rodallega Saavedra
Julio Cardenas
David Hereira
Juan Diego
Juan Diego
Victor Ortiz
Alejandro Anaya
Waldir Zapata Garcia
Gonzalo Gutiérrez Castillo
José Miguel Reyes
iecgerman .
Harold Zurita Simon
Jhon Freddy Tavera Blandon
Camilo Andrés Rodriguez Higuera
Edgar Alarcón
:warning: Lee esto si tú código sigue la guía y aun así los test te arrojan errores.
Este último ejercicio tiene (lo que yo considero) inconsistencias en la explicación de lo que debe hacer cada método vs con lo que se espera en las pruebas.
dequeue() dice:Elimina y devuelve un objeto con las siguientes propiedades:
{ from, to, body, subject }del correo electrónico más antiguo de la cola.
En el ejemplo del resultado que debemos obtener al llamar a dequeue nos dan el siguiente Output:
Output: { 'from': 'jane@ejemplo.com', 'to': 'support@ejemplo.com', 'body': 'No puedo iniciar sesión en mi cuenta', 'subject': 'Problema de inicio de sesión' }
Sin embargo a la hora de correr los test siguiente lo que establece la descripción del funcionamiento para el método dequeue, obtengo el siguiente error:
En la descripción dice "objeto con las siguientes propiedades: { from, to, body, subject }", from no from_email.
En el código al cambiar from por from_email el error sigue apareciendo.
def dequeue(self): if not self.first: raise IndexError("No hay emails.") first_email = { "from_email": self.first.from_email , "to": self.first.to, "body": self.first.body, "subject": self.first.subject } if self.first == self.last: self.first = None self.last = None else: self.first = self.first.next self.length -= 1 return first_email
Lo mismo ocurre con los test para las funciones enqueue() y peek()
Esa es la inconsistencia #1 que encontré. La 2da:
dequeue() y peek() no tienen nada que ver con los mensajes de error en los test.código de solución:
def dequeue(self): if self.is_empty(): raise IndexError("La cola está vacía") removed_mail = self.first # se asigna el nodo completo de first a removed_main if self.length == 1: self.first = None self.last = None else: self.first = removed_mail.next removed_mail.next = None self.length -= 1 return removed_mail # No esta regresando un diccionario sino el nodo
En el código de solución retorna el nodo no un diccionario con los atributos que se especifican en la descripción del ejercicio. Al momento de correr el ejemplo en lugar de obtener el output
{ 'from': 'jane@ejemplo.com', 'to': 'support@ejemplo.com', 'body': 'No puedo iniciar sesión en mi cuenta', 'subject': 'Problema de inicio de sesión' }
Obtenemos como resultado la referencia en memoria del nodo:
<mail.Mail object at 0x1c19f28>
El objetivo de este comentario es que el Team Platzi corrija la descripción de este ejercicio y los mensajes de los test, para que a los siguientes alumnos que lleguen hasta aquí no se topen con este inconveniente y luego no sepan que esta mal en su complementación en el playground cuando en local(XD) si funciona y sigue todas las instrucciones que describe la guía.
. Si alguien se toma la molestia de leer este aporte, agradecería me diera su feedback y si estoy algo incorrecto por favor me lo hagan saber.
#NuncaParenDeAprender :green_heart:
Gracias Paola!
Mil gracias por tus comentarios.!
class Mail: def __init__(self, from_email, to, body, subject): self.from_email = from_email self.to = to self.body = body self.subject = subject self.next = None class Queue: def __init__(self): self.front = None self.rear = None self._size = 0 def enqueue(self, from_email, to, body, subject): new_mail = Mail(from_email, to, body, subject) if self.rear is None: self.front = new_mail self.rear = new_mail else: self.rear.next = new_mail self.rear = new_mail self._size += 1 def dequeue(self): if self.front is None: raise Exception("La cola está vacía") removed = self.front self.front = self.front.next if self.front is None: self.rear = None self._size -= 1 return { "from": removed.from_email, "to": removed.to, "body": removed.body, "subject": removed.subject } def peek(self): if self.front is None: raise Exception("La cola está vacía") return { "from": self.front.from_email, "to": self.front.to, "body": self.front.body, "subject": self.front.subject } def is_empty(self): return self.front is None def size(self): return self._size emailQueue = Queue() emailQueue.enqueue( 'jane@ejemplo.com', 'support@ejemplo.com', 'No puedo iniciar sesión en mi cuenta', 'Problema de inicio de sesión' ) emailQueue.enqueue( 'joe@ejemplo.com', 'support@ejemplo.com', 'Mi pedido no ha llegado todavía', 'Estado del pedido' ) email = emailQueue.dequeue() print(email) ```class Mail: def \_\_init\_\_(self, from\_email, to, body, subject): self.from\_email = from\_email self.to = to self.body = body self.subject = subject self.next = None class Queue: def \_\_init\_\_(self): self.front = None self.rear = None self.\_size = 0 def enqueue(self, from\_email, to, body, subject): new\_mail = Mail(from\_email, to, body, subject) if self.rear is None: self.front = new\_mail self.rear = new\_mail else: self.rear.next = new\_mail self.rear = new\_mail self.\_size += 1 def dequeue(self): if self.front is None: raise Exception("La cola está vacía") removed = self.front self.front = self.front.next if self.front is None: self.rear = None self.\_size -= 1 return { "from": removed.from\_email, "to": removed.to, "body": removed.body, "subject": removed.subject } def peek(self): if self.front is None: raise Exception("La cola está vacía") return { "from": self.front.from\_email, "to": self.front.to, "body": self.front.body, "subject": self.front.subject } def is\_empty(self): return self.front is None def size(self): return self.\_size emailQueue = Queue() emailQueue.enqueue( 'jane@ejemplo.com', 'support@ejemplo.com', 'No puedo iniciar sesión en mi cuenta', 'Problema de inicio de sesión') emailQueue.enqueue( 'joe@ejemplo.com', 'support@ejemplo.com', 'Mi pedido no ha llegado todavía', 'Estado del pedido') email = emailQueue.dequeue()print(email)
from mail import Mail class Queue: def __init__(self): self.first = None self.last = None self.length = 0 def enqueue(self, from_email, to, body, subject): new_node = Mail(from_email, to, body, subject) if self.length == 0: self.first = new_node self.last = new_node else: self.last.next = new_node self.last = new_node self.length += 1 def dequeue(self): if self.length == 0: raise IndexError("La queue está vacía") removed_node = self.first if self.first == self.last: self.last = None self.first = self.first.next self.length -= 1 return removed_node def peek(self): return self.first def is_empty(self): return self.length == 0 def size(self): return self.length
o o o o o o o o
class Mail: def __init__(self, from_email, to, body, subject): self.from_email = from_email self.to = to self.body = body self.subject = subject self.next = None
class Queue: def __init__(self): self.cabeza = None self.cola = None self.longitud = 0 def enqueue(self, from_email, to, body, subject): newMail = Mail(from_email, to, body, subject) if self.longitud == 0: self.cabeza = newMail self.cola = newMail else: self.cola.next = newMail self.cola = newMail self.longitud += 1 def dequeue(self): if self.longitud == 0: raise Exception("La cola esta vacia") else: salida = {} salida["from"] = self.cabeza.from_email salida["to"] = self.cabeza.to salida["body"] = self.cabeza.body salida["subject"] = self.cabeza.subject auxiliar = self.cabeza self.cabeza = self.cabeza.next del auxiliar self.longitud -= 1 if self.longitud == 0: self.cola = None return salida def peek(self): if self.longitud == 0: raise Exception("La cola esta vacia") else: salida = {} salida["from"] = self.cabeza.from_email salida["to"] = self.cabeza.to salida["body"] = self.cabeza.body salida["subject"] = self.cabeza.subject return salida def is_empty(self): return self.longitud == 0 def size(self): return self.longitud
emailQueue = Queue() emailQueue.enqueue( 'jane@ejemplo.com', 'support@ejemplo.com', 'No puedo iniciar sesión en mi cuenta', 'Problema de inicio de sesión' ) print("primer correo") print(emailQueue.is_empty()) print(emailQueue.size()) print(emailQueue.peek()) print() emailQueue.enqueue( 'joe@ejemplo.com', 'support@ejemplo.com', 'Mi pedido no ha llegado todavía', 'Estado del pedido' ) print("segundo correo") print(emailQueue.is_empty()) print(emailQueue.size()) print(emailQueue.peek()) print() emailQueue.enqueue( 'peter@ejemplo.com', 'support@ejemplo.com', 'pedido llego en mal estado', 'Estado del pedido' ) print("tercer correo") print(emailQueue.is_empty()) print(emailQueue.size()) print(emailQueue.peek()) print() print(emailQueue.dequeue()) print("proximo correo") print(emailQueue.is_empty()) print(emailQueue.size()) print(emailQueue.peek()) print() print(emailQueue.dequeue()) print("proximo correo") print(emailQueue.is_empty()) print(emailQueue.size()) print(emailQueue.peek()) print() print(emailQueue.dequeue()) print("proximo correo") print(emailQueue.is_empty()) print(emailQueue.size()) print()
Mi solución * * * * * * * *
from mail import Mail class Queue: def __init__(self): # Tu código aquí 👇 self.first = None self.last = None self.length = 0 def enqueue(self, from_email, to, body, subject): # Tu código aquí 👇 new_node = Mail(from_email, to, body, subject) if self.length == 0: self.first = new_node self.last = new_node else: self.last.next =new_node self.last = new_node self.length +=1 def dequeue(self): # Tu código aquí 👇 if self.length ==0: raise IndexError('La queue está vacía') removed_node = self.first if self.first == self.last: self.last = None self.first = self.first.next self.length -=1 return removed_node def peek(self): # Tu código aquí 👇 return self.first def is_empty(self): # Tu código aquí 👇 return True if self.length ==0 else False def size(self): # Tu código aquí 👇 return self.length
class Mail: def __init__(self, from_email, to, body, subject): self.from_email = from_email self.to = to self.body = body self.subject = subject self.next = None class Queue: def __init__(self): self.first = None self.last = None self.lenght = 0 def enqueue(self, from_email, to, body, subject): new_node = Mail(from_email, to, body, subject) if self.lenght == 0: self.first = new_node self.last = new_node else: self.last.next = new_node self.last = new_node self.lenght += 1 def dequeue(self): if self.lenght == 0: raise IndexError("La cola está vacía") removed_node = self.first if self.first == self.last: self.last = None self.first = self.first.next self.lenght -=1 return removed_node def peek(self): if self.lenght == 0: raise IndexError("La cola está vacía") return self.first def is_empty(self): return self.lenght == 0 def size(self): return self.lenght ```class Mail: def \_\_init\_\_(self, from\_email, to, body, subject): self.from\_email = from\_email self.to = to self.body = body self.subject = subject self.next = None class Queue: def \_\_init\_\_(self): self.first = None self.last = None self.lenght = 0 def enqueue(self, from\_email, to, body, subject): new\_node = Mail(from\_email, to, body, subject) if self.lenght == 0: self.first = new\_node self.last = new\_node else: self.last.next = new\_node self.last = new\_node self.lenght += 1 def dequeue(self): if self.lenght == 0: raise IndexError("La cola está vacía") removed\_node = self.first if self.first == self.last: self.last = None self.first = self.first.next self.lenght -=1 return removed\_node def peek(self): if self.lenght == 0: raise IndexError("La cola está vacía") return self.first def is\_empty(self): return self.lenght == 0 def size(self): return self.lenght
Mi solución: . . . . . . . . . . . . . . . . . .
from mail import Mail class Queue: def __init__(self): # Tu código aquí 👇 self.first = None self.last = None self.length = 0 pass def enqueue(self, from_email, to, body, subject): # Tu código aquí 👇 newMail = Mail(from_email, to, body, subject) if self.length == 0: self.first = newMail self.last = newMail else: self.last.next = newMail self.last = newMail self.length += 1 pass def dequeue(self): # Tu código aquí 👇 if self.length == 0: raise IndexError('No hay correos electronicos') email = self.first if self.first == self.last: self.last = None self.first = self.first.next self.length -= 1 return email pass def peek(self): # Tu código aquí 👇 return self.first pass def is_empty(self): # Tu código aquí 👇 return self.length == 0 pass def size(self): # Tu código aquí 👇 return self.length pass
🛡️🛡️Escudo anti-spoilers🛡️🛡️
Mi solución al reto:
# main.py from mail import Mail class Queue: def __init__(self): self.first = self.last = None self.length = 0 def enqueue(self, from_email, to, body, subject): newEmail = Mail(from_email, to, body, subject) if self.first is None and self.last is None: self.first = self.last = newEmail else: self.last.next = newEmail self.last = newEmail self.length += 1 def dequeue(self): if self.length == 0: raise IndexError("No tenemos mas correos") removed_mail = self.first if self.first == self.last: self.last = None self.first = self.first.next self.length -= 1 return removed_mail def peek(self): return self.first def is_empty(self): return self.length <= 0 def size(self): return self.length
class Mail: def __init__(self, from_email, to, body, subject): self.from_email = from_email self.to = to self.body = body self.subject = subject self.next = None
from mail import Mail class Queue: def __init__(self): self.first =None self.last =None self.length = 0 def enqueue(self, from_email, to, body, subject): new_mail = Mail(from_email, to, body, subject) if self.length == 0: self.first = new_mail self.last = new_mail else: self.last.next = new_mail self.last = new_mail self.length += 1 def dequeue(self): if self.length == 0: raise IndexError("La queue está vacía") if self.first == self.last: self.last =None removed_email = self.first self.first = self.first.next self.length -= 1 return removed_email def peek(self): if self.is_empty(): raise IndexError("No hay correos") return self.first def is_empty(self): return self.length == 0 def size(self): return self.length emailQueue = Queue() emailQueue.enqueue( 'jane@ejemplo.com', 'support@ejemplo.com', 'No puedo iniciar sesión en mi cuenta', 'Problema de inicio de sesión' ) emailQueue.enqueue( 'joe@ejemplo.com', 'support@ejemplo.com', 'Mi pedido no ha llegado todavía', 'Estado del pedido' ) email = emailQueue.dequeue() print(email)
Mi código:
from mail import Mail class Queue: def __init__(self): self.first = None self.last = None self.length = 0 def enqueue(self, from_email, to, body, subject): new_mail = Mail(from_email, to, body, subject) if self.is_empty(): self.first = new_mail else: self.last.next = new_mail self.last = new_mail self.length += 1 def dequeue(self): if self.is_empty(): raise IndexError("No hay correos") removed_mail = self.first if self.first == self.last: self.last = None self.first = self.first.next self.length -= 1 return removed_mail def peek(self): if self.is_empty(): raise IndexError("No hay correos") return self.first def is_empty(self): return self.length == 0 def size(self): return self.length
Solución 😄… .
class Mail: def __init__(self, from_email, to, body, subject): self.from_email = from_email self.to = to self.body = body self.subject = subject self.next = None
Main:
from mail import Mail class Queue: def __init__(self): self.first = None self.last = None self.length = 0 def enqueue(self, from_email, to, body, subject): mail = Mail(from_email, to, body, subject) if self.length == 0: self.first = mail self.last = mail else: self.last.next = mail self.last = mail self.length += 1 def dequeue(self): if self.length == 0: raise IndexError("La queue está vacía") removed_mail = self.first if self.first == self.last: self.last = None self.first = self.first.next self.length -= 1 return removed_mail def peek(self): return self.first def is_empty(self): return self.length == 0 def size(self): return self.length
emailQueue = Queue() emailQueue.enqueue( 'jane@ejemplo.com', 'support@ejemplo.com', 'No puedo iniciar sesión en mi cuenta', 'Problema de inicio de sesión' ) emailQueue.enqueue( 'joe@ejemplo.com', 'support@ejemplo.com', 'Mi pedido no ha llegado todavía', 'Estado del pedido' ) email = emailQueue.dequeue() print(email)
from mail import Mail class Queue: def __init__(self): self.first = None self.last = None self.length = 0 def enqueue(self, from_email, to, body, subject): new_mail = Mail(from_email, to, body, subject) if self.is_empty(): self.first = new_mail else: self.last.next = new_mail self.last = new_mail self.length += 1 def dequeue(self): if self.is_empty(): raise IndexError("No hay correos") removed_mail = self.first if self.first == self.last: self.last = None self.first = self.first.next self.length -= 1 return removed_mail def peek(self): if self.is_empty(): raise IndexError("No hay correos") return self.first def is_empty(self): if self.length == 0: return True return False def size(self): return self.length