I have been tasked on building a code using queues and a class in which you get three options:
- Generates a new number
- Calls on the first number of the queue and takes it out of the main queue(there is an auxiliary queue for that)
- Shows the already called numbers
This is the class created:
class Fila:
def __init__(self):
self._vet = []
def enqueue(self, item): # enfileirar
self._vet.append([-1])
def dequeue(self): # desenfileirar
self._vet.pop(0)
def front(self): # mostrar o 1o da fila, sem remover!
return(self._vet[1])
def is_empty(self): # retorna se a fila esta vazia
if len(self._vet) == 0:
return True
return False
def __len__(self):
return len(self._vet)
def __str__(self): # representacao da fila como string
return str(self._vet)
And this is the code I came up with:
from classeFila import *
if __name__ == "__main__":
f1 = Fila()
fAux = Fila()
contador = 0
while True:
opcao = int(input("Digite 1 para obter nova senha, 2 para chamar próxima senha ou 3 para mostrar senhas chamadas."))
if opcao == 1:
contador = 1
f1.enqueue(contador)
print("Sua senha é a de número", contador)
elif opcao == 2:
print("Senha número", f1[0], "está sendo chamada." )
fAux.enqueue(f1[0])
f1.dequeue()
elif opcao == 3:
print(fAux)
else:
print("Digite um número válido.")
The problem is, the moment I run the code and input option number 2, I get the error:
Traceback (most recent call last):
File "c:\\Users\\thoma\\Desktop\\Projetos Python\\Fahad\\Filas\\senhas.py", line 16, in \<module\>
print("Senha número", f1\[0\], "está sendo chamada." )
TypeError: 'Fila' object is not subscriptable
And while I get that the problem here is trying to use indexes, I've come short in terms of solutions as how I could specify which number is being called(f1[0] in "elif opcao == 2") without using indexing. Any guidance?
Tried taking out the index in the f1[0] mentioned above, and while the program could be run, the terminal would display "Senha número [-1, -1] está sendo chamada", or "Number [-1, -1] is being called", if you will.
CodePudding user response:
add __getitem__
function, this will allow you to use f1[0]
in your code, this will get the element within f1
at the index of 0
from the internal _vet
array read more here
class Fila:
def __init__(self):
self._vet = []
def enqueue(self, item): # enfileirar
self._vet.append([-1])
def dequeue(self): # desenfileirar
self._vet.pop(0)
def front(self): # mostrar o 1o da fila, sem remover!
return(self._vet[1])
def is_empty(self): # retorna se a fila esta vazia
if len(self._vet) == 0:
return True
return False
def __len__(self):
return len(self._vet)
def __str__(self): # representacao da fila como string
return str(self._vet)
def __getitem__(self, key): # this allows getting an element (overrided method)
return self._vet[key]
CodePudding user response:
f1
is an object of class Fila
and hence you can't write or use it as f1[0]