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.
Advertisement
Answer
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]