A.Maine - 1 year ago 122
Python Question

# Radix sorting, "Queue" object not iterable

I've come to an end with my assignment, I don't know where I go from where I am right now, the code is currently looking like this:

``````from labb7 import Queue
import random

div=1
mod=10
q=Queue()
bin_list=[]
for k in range(0,m):
q.put(random.randint(1,10**n))
for bins in range(0,10):
bin_list.append(q)
while not q.isempty():
value=q.get()
minsta_tal=value%mod
minsta_tal=int(minsta_tal//div)
bin_list[minsta_tal].put(value)
mod=mod*10
div=div*10
for bins in bin_list:
while not bins.isempty():
for x in bins:
r=[]
r.append(x)
return r
``````

What I've been trying to do is to create 10 queues in put them in a list, then random m numbers from 1 to 10^n. Lets say I get 66 and 72, then I first sort them by the "small number", that is 6 and 2 in my numbers, then put them in a lost, and then do the process all over again but for the number 6 and 7 (the bigger number). In its current shape I get the error "Queue" object is not iterable.

My Queue class is looking like this, I think this one is okay.

``````class Queue:
def __init__(self):
self.lista=[]

def put(self,x):
self.lista.append(x)

def get(self):
if not len(self.lista)==0:
return self.lista.pop(0)

def isempty(self):
if self.lista==0:
return True
else:
False

def length(self):
return len(self.lista)

def __iter__(self):
return self

def __next__(self):
if self.lista:
return self.lista.pop(0)
raise StopIteration
``````

You need to add a bit more code to make it an iterable. `__iter__` should return an iterator. The iterator should have a `next` method.

Take a look at this:

How to make class iterable?

So it is my understanding that the thing you want to iterate over is the contents of `self.lista`... Why not just return `lista`'s iterator.

Here is the easiest way to do that:

``````class Queue:
...
def __iter__(self):
return self.lista.__iter__()
``````

It's a bit hard to see what exactly it is that you want.. If what you are trying to do is empty `lista`as you iterate over it (Queue is a fifo kinda deal) it then rather do this:

``````class Queue:
...
def __iter__(self):
return self
def next(self):
if self.lista: #since empty lists are Falsey
return self.lista.pop(0)
raise StopIteration
``````
Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download