We have covered off many TypeErrors on this website, here we will go through which using a list with and it is not an iterator gives you errors.
In order to understand this error better, we need to first understand what is an iterator in Python?
An iterator is a Python object that has the following characteristics:
- You can count the no of values that are contained within it.
- It also can be iterated through, so you need to apply an iteration method to it.
How does this error occur?
Normally this error occurs when you try to iterate over a list, but you have not made the list iterable.
There are two things required to make this happen:
(A) The iter() returns an iterator object
(B) The next() method moves to the next value.
Without both the code will fail and the error you are about will occur!
In the below code we have a list:
a = ['q', 'w', 'e', 'r', 't', 'y']
with the following:
b = next(a)
b = next(a)
b = next(a)
b = next(a)
b = next(a)
b = next(a)
As can be seen in the above code we have one component for the iteration , we expect two as per the above.
As a result we get the error:
Traceback (most recent call last):
File "list_object_is_not_an_iterator.py", line 13, in <module>
b = next(a)
TypeError: 'list' object is not an iterator
In order to fix this ,all we need to do is apply the iterator to the list as follows:
a = iter(['q', 'w', 'e', 'r', 't', 'y']) ====> We added in the iter() here, enclosing the list within it
b = next(a)
b = next(a)
b = next(a)
b = next(a)
b = next(a)
b = next(a)
#b = next(a)
print(b)
Giving output:
y
As a result of this, we now have the two required methods that will not give this error.
What is going on within the iterator?
In the above code we have asked to print b. What the iterator is doing is going to the first value of b, in this case q and print.
But because we have a variable b on multiple lines, with the method “next()” in it, the logic is moving through each value of the list till it gets to the end.
What can be done though is , reduce the length of the returned b variables to print as follows:
a = iter(['q', 'w', 'e', 'r', 't', 'y'])
b = next(a)
print(b)
returns:
q
BUT
a = iter(['q', 'w', 'e', 'r', 't', 'y'])
b = next(a)
b = next(a)
print(b)
returns:
w
As can be seen it returns the next value in the list. You can keep adding the b variables.
What happens when you get to the end of the list?
So now we have the below, and we are returning the last value:
a = iter(['q', 'w', 'e', 'r', 't', 'y']) b = next(a) b = next(a) b = next(a) b = next(a) b = next(a) b = next(a) Returns: y
The reason for this is that we have the required no of variables with the next method, which equals the length of the list.
If we add in one more b variable:
a = iter(['q', 'w', 'e', 'r', 't', 'y'])
b = next(a)
b = next(a)
b = next(a)
b = next(a)
b = next(a)
b = next(a)
b = next(a) ===> Additional b variable
Returns:
Traceback (most recent call last):
File "list_object_is_not_an_iterator.py", line 19, in <module>
b = next(a)
StopIteration
The purpose of StopIteration is to not allow a continuous loop and recognise that the end of the list has been reached.
Implementing Iterators
Iterators could be used in the following circumstances:
(A) You have a defined list of object values to work with.
(B) If sequence is important an iterator will help to process values in the order they appear in a list.