In Python 3, a map object is an iterator and is not subscriptable. If you try to access items inside a map object using the subscript operator [], you will raise the TypeError: ‘map’ object is not subscriptable.
This error typically occurs when using Python 2 syntax when using Python 3. In Python 2, calling the built-in map() function returns a list, which is subscriptable.
You can solve this error by converting the map object to a list using the built-in list function. For example,
new_list = list(map(int, old_list))
You can also iterate over the values in the iterator using a for
loop
This tutorial will go through the error in detail and how to solve it with code examples.
Table of contents
TypeError: ‘map’ object is not subscriptable
A TypeError occurs when you perform an illegal operation for a specific data type.
What Does Subscriptable Mean?
The subscript operator, which is square brackets []
, retrieves items from subscriptable objects like lists or tuples. The operator calls the __getitem__
method, for example, a[i]
is equivalent to a.__getitem__(i)
.
All subscriptable objects have a __getitem__
method. Map objects are iterators and do not have a __getitem__
method. We can verify that map objects do not have the __getitem__
method by defining a creating a map object and passing it to the dir()
method:
def square(i): res = i ** 2 return res lst = [2, 3, 4, 5] squared = map(square, lst) print(dir(squared))
['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__lt__', '__ne__', '__new__', '__next__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']
A Python iterator object must implement two special methods, __iter__() and __next__(), collectively called the iterator protocol.
Example
This error typically occurs when using Python 2 map operations in Python 3. First, let’s verify what the built-in map function returns in Python 2. We will use a virtual environment with Python 2 installed and confirm that we are using Python 2 using the sys library:
import sys print(sys.version)
2.7.16 |Anaconda, Inc.| (default, Sep 24 2019, 16:55:38) [GCC 4.2.1 Compatible Clang 4.0.1 (tags/RELEASE_401/final)]
Next, we will define a list of strings, which we will convert to a list of integers using the map()
function. We will pass the object returned by the map function to the type()
function to get the type.
string_list = ["2", "3", "4", "5", "6"] int_list = map(int, string_list) print(type(int_list))
Let’s run the code to get the result:
<type 'list'>
In Python 2, the map function returns a list, which is subscriptable. We access an element of the list using the subscript operator, for example:
print(int_list[0])
2
Let’s try to do this using Python 3. We will use a different virtual environment with Python 3 installed, which we will verify using sys.
import sys print(sys.version)
3.8.12 (default, Oct 12 2021, 06:23:56) [Clang 10.0.0 ]
Next, we will define our list of strings and use the map()
function to convert it to a list of integers. We will pass the object returned by the map function to the type function.
string_list = ["2", "3", "4", "5", "6"] int_list = map(int, string_list) print(type(int_list))
Let’s run the code to see the result:
<class 'map'>
In Python 3, the map function returns a map object, which is an iterator. If we try to access an element of the map object using the subscript operator, we will raise the TypeError.
print(int_list[0])
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) Input In [4], in <cell line: 1>() ----> 1 print(int_list[0]) TypeError: 'map' object is not subscriptable
Solution #1
We can convert map objects to lists using the built-in list() function. Let’s look at the revised code:
string_list = ["2", "3", "4", "5", "6"] int_list = list(map(int, string_list)) print(type(int_list)) print(int_list[0])
Let’s run the code to get the result:
<class 'list'> 2
Solution #2
We can access values in an iterator using a for loop, which invokes the __next__()
method of the map iterator. Let’s look at the revised code:
string_list = ["2", "3", "4", "5", "6"] int_list = map(int, string_list) for i in int_list: print(i)
Let’s run the code to get the result:
2 3 4 5 6
Summary
Congratulations on reading to the end of this tutorial! The TypeError: ‘map’ object is not subscriptable occurs when you try to access an item from a map object in Python 3. The Python 3 map object is an iterator and is not subscriptable. We can convert map objects to lists which are subscriptable.
For further reading on TypeErrors, go to the article: How to Solve Python TypeError: ‘function’ object is not subscriptable
Go to the online courses page on Python to learn more about Python for data science and machine learning.
Have fun and happy researching!
Suf is a senior advisor in data science with deep expertise in Natural Language Processing, Complex Networks, and Anomaly Detection. Formerly a postdoctoral research fellow, he applied advanced physics techniques to tackle real-world, data-heavy industry challenges. Before that, he was a particle physicist at the ATLAS Experiment of the Large Hadron Collider. Now, he’s focused on bringing more fun and curiosity to the world of science and research online.