0

Hello I've been doing some HashSet Questions for the past week or so. The last Question asks me to create iter method for my HashSet. Here is my code:

class HashSet:
    def __init__(self, capacity=10):
        self.table = [None] * capacity

    def add(self, item):
        h = hash(item)
        index = h % len(self.table)

        if self.table[index] == None:
            self.table[index] = LinkedList() 

        if item not in self.table[index]:
            self.table[index].add(item)

    def __iter__(self):
        table = []
        ptr = None
        for i in range(0, len(self.table)):
            if self.table[i]:
                ptr = self.table[i].head
                while ptr != None:
                    table.append(ptr.item)
                    ptr = ptr.next
        return sorted(table)

It doesn't seem to work and it gives me an error: TypeError: iter() returned non-iterator of type 'list'. What am I supposed to return??

Input: 7 20 30 40 50 60 70 80 90
Desired Output: [20, 30, 40, 50, 60, 70, 80, 90]

Values inside table var are correct I tested that with print() statement. How do I fix it ?

OmO Walker
  • 611
  • 6
  • 13

1 Answers1

1

You should return an iterator or delegate the iteration using yield from:

def __iter__(self):
    ...
    return iter(sorted(table)) # creates an iterator from the list

Or

def __iter__(self):
    ...
    yield from sorted(table) # Python 3's generator delegation syntax
Moses Koledoye
  • 77,341
  • 8
  • 133
  • 139