How to fix TypeError: 'int' object is not subscriptable error in deques, python

24 Views Asked by At

I am trying to code Round Robin scheduling algorithm in python3.10. But I kept getting this error, when i try to access elements of each list inside deque self.__ready_queue:

Traceback (most recent call last):
  File "/home/neo/Documents/Python/Scheduling Algorithms/rr.py", line 94, in <module>
    rr.calculate()
  File "/home/neo/Documents/Python/Scheduling Algorithms/rr.py", line 61, in calculate
    if list(self.__ready_queue)[i][2] <= self.time_quantum:
TypeError: 'int' object is not subscriptable

I tried printing it but it worked fine, but when i used it in conditionals or inside f-string, it is giving that error Here is the code block that is producing that error:

def calculate(self):
    grant_chart = f'{self.__ready_queue[0][1]} '
    n_a_t = 0
    completion_times = []
    i = 0
    while len(self.__ready_queue) != 0:
      if self.__ready_queue[i][2] <= self.time_quantum:
        n_a_t += self.__ready_queue[i][2]
        completion_times.append([self.__ready_queue[i][0], n_a_t])
        self.__ready_queue.popleft()
      else:
        n_a_t += self.time_quantum
        item = self.__ready_queue[i][2]
        self.__ready_queue[i][2] -= self.time_quantum
        self.__ready_queue.popleft()
        self.__ready_queue.append(item)
      gant_chart += f'{self.__ready_queue[i][0]} {n_a_t} '
      if i+1 > len(self.__ready_queue):
        i = 0
      else:
        i += 1
    print(gant_chart)

And here is all the code:

from tabulate import tabulate
from collections import deque

# INFO
# Completion Time - time to complete certain process
# Turn Around Time = Completion Time - Arrival Time

# Constants 
ARRIVAL_TIME = 'arrival_time'
BURST_TIME = 'burst_time'
COMPLETION_TIME = 'completion_time'
WAITING_TIME = 'waiting_time'
TURNAROUND_TIME = 'turnaround_time'

class RoundRobin:
  def __init__(self, processes: list, arrival_times: list, burst_times: list, time_quantum: int):
    self.time_quantum = time_quantum
    self.processes = processes
    self.arrival_times = arrival_times
    self.burst_times = burst_times
    self.__waiting_times = [0] * len(self.processes)
    self.__turnaround_times = [0] * len(self.processes)
    self.__completion_times = [0] * len(self.processes)
    self.__zipped = zip(
      self.processes, 
      self.arrival_times, 
      self.burst_times, 
      self.__completion_times,  
      self.__waiting_times, 
      self.__turnaround_times
      )
    self.__mapped = list(map(lambda x: list(x), self.__zipped))
    self.__sorted = sorted(self.__mapped, key=lambda x : x[1])
    self.__ready_queue = deque([[x[0], x[1], x[2]] for x in self.__sorted])
    self.__dicted = {
      x[0]: {
        ARRIVAL_TIME: x[1], 
        BURST_TIME: x[2], 
        COMPLETION_TIME: self.__completion_times[self.processes.index(x[0])], 
        WAITING_TIME: self.__waiting_times[self.processes.index(x[0])], 
        TURNAROUND_TIME: self.__turnaround_times[self.processes.index(x[0])]} 
        for x in self.__sorted
        }
    self.__table = tabulate(self.__mapped, headers=['Process ID', 'Arrival Time', 'Burst Time', 'Completion Time', 'Waiting Time', 'Turnaround Time'], tablefmt='github')

  def calculate(self):
    gant_chart = f'{self.__ready_queue[0][1]} '
    n_a_t = 0
    completion_times = []
    i = 0
    while len(self.__ready_queue) != 0:
      if self.__ready_queue[i][2] <= self.time_quantum:
        n_a_t += self.__ready_queue[i][2]
        completion_times.append([self.__ready_queue[i][0], n_a_t])
        self.__ready_queue.popleft()
      else:
        n_a_t += self.time_quantum
        item = self.__ready_queue[i][2]
        self.__ready_queue[i][2] -= self.time_quantum
        self.__ready_queue.popleft()
        self.__ready_queue.append(item)
      gant_chart += f'{self.__ready_queue[i][0]} {n_a_t} '
      if i+1 > len(self.__ready_queue):
        i = 0
      else:
        i += 1
    print(gant_chart)
    print(self.__ready_queue[i][0])
    
  def print_as_diagram(self):
    print(self.__table)
  
rr = RoundRobin(('p1', 'p2', 'p3', 'p4'), (0, 1, 2, 3), (8, 4, 10, 5), 4)
# rr.print_as_diagram()
rr.calculate()
0

There are 0 best solutions below