'TypeError: unsupported operand type(s) for %: 'int' and 'Element'

So this is for my homework in cs class. The first tasks where coding the sieve of eratosthenes and comparing it with different data structures. The last part is to use my sive to return all factors of n.

Sieve:

def eratosthenes(ds):
""" Your code here """
a = int((len(ds) + 1) / 2 + 1)
for i in range(2, len(ds) + 1):
    for j in range(2, len(ds) + 1):
        o = i * j
        if ds.contains(o):
            ds.remove(o)
return ds

Data Structure:

class DynamicArray:
    class Iterator:

        def __init__(self, array):
            self._array = array
            self._index = 0

        def __next__(self):
            if self._index < len(self._array):
                index = self._index
                self._index += 1
                return self._array[index]
            raise StopIteration

    class Element:

        def __init__(self, data):
            self._data = data

        @property
        def data(self):
            return self._data

        def __str__(self):
            return str(self.data)

        def __repr__(self):
            return str(self.data)

    def __init__(self):
         self._len = 0
         self._data = list()

    def __len__(self):
        return self._len

    def __getitem__(self, i):
        if len(self) == 0:
            raise IndexError("no data")
        return self._data[i]

    def __repr__(self):
        return str(self._data)

    @property
    def first(self):
        return self[0]

    @property
    def last(self):
        return self[-1]

    def append(self, data):
        if self._data is None:
            self._data = [self.Element(data)]
        else:
            ndata = [None] * (len(self) + 1)
            for i, elem in enumerate(self):
                ndata[i] = elem
            ndata[-1] = self.Element(data)
            self._data = ndata
        self._len += 1

    def remove(self, data):
        c = 0
        for elem in self:
            if elem.data == data:
                c += 1
        nlen = len(self) - c
        ndata = [None] * nlen
        c = 0
        for elem in self:
            if elem.data != data:
                ndata[c] = elem
                c += 1
        self._data = ndata
        self._len = nlen

    def contains(self, data):
        for element in self:
            if element.data == data:
                return True
        return False

    def reverse(self):
        ndata = [None] * len(self)
        n = len(self) - 1
        for i, elem in enumerate(self):
            ndata[n - i] = elem
        self._data = ndata
        return self

I thought of iterating trough the data structure and remove all items that are not modulo 0. But I get an TypeError when i try to use modulo while iterating trough the list.

def prime_factors(n):
arr = DynamicArray()
for i in range(2, n + 1):
    arr.append(i)
arr = eratosthenes(arr)
for factor in arr:
     if n % factor == 0:
        arr.remove(factor)
return arr


Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source