Что такое map
?
Это функция, которая применит первый аргумент (функцию) к каждому элементу второго аргумента (коллекции), но в python3 это не происходит сразу, как в python2, где map
возвращает список:
>>> map(int, "12345")
[1, 2, 3, 4, 5]
А постепенно, т.к. map
возвращает итератор «map object»:
>>> map(int, "12345")
<map object at 0x000001D51030BB50>
И как все итераторы, мы можем итерировать по map
с помощью next
:
>>> m = map(int, "12345")
>>> next(m)
1
>>> next(m)
2
>>> next(m)
3
>>> next(m)
4
>>> next(m)
5
>>> next(m)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
Или же с помощь. for
цикла:
>>> for i in map(int, "12345"):
... print(i)
...
1
2
3
4
5
В чём проблема?
Вы пытаетесь получить первый элемент итератора, но т.к. у итератор нет элементов, он создаёт их «на лету», то и питон на это жалуется:
>>> map(int, "12345")[0]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'map' object is not subscriptable
Что же вы хотите сделать — превратить map
в коллекцию, например list
, тогда и по индексу можно будет обращаться:
>>> result = list(map(int, "12345"))
>>> result[0]
1
>>> for i in result[1:]:
... print(i)
...
2
3
4
5
Альтернатива
В питоне также есть comprehension
s — это способ инициализировать что-то, в нашем случае список:
>>> [int(i) for i in "12345"]
[1, 2, 3, 4, 5]
Здесь используется for
цикл, чтобы создавать значения, а значение int(i)
уже записывается в конечный список.
Хитрость
Вы использовали flag
, чтобы проверить, вышли ли вы из цикла с помощью break
, но в питоне есть специальный синтаксис для этого — for .. else ..
:
>>> for i in 1, 2, 3:
... if i == 2:
... print("нашёл")
... break
... else:
... print("не нашёл")
...
нашёл
Если мы выходим из цикла через break
, то else
будет проигнорирован
>>> for i in 1, 3:
... if i == 2:
... print("нашёл")
... break
... else:
... print("не нашёл")
...
не нашёл
А если не выйдем, то выполнится.
Итог
Если мы применим наши новые знания, то получим:
a = [int(i) for i in input().split(" ")]
prev = a[0]
for i in a[1:]:
if prev <= i:
prev = i
else:
print("No")
break
else:
print("Yes")
или
a = list(map(int, input().split(" ")))
prev = a[0]
for i in a[1:]:
if prev <= i:
prev = i
else:
print("No")
break
else:
print("Yes")
в зависимости от того, что вы предпочитаете, map
или comprehension
.
(как по мне, comprehension
s намного более интуитивные :] )
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
- What Does Subscriptable Mean?
- Example
- Solution #1
- Solution #2
- Summary
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!
- Cause of the
TypeError: 'map' object is not subscriptable
Error in Python - Fix the
TypeError: 'map' object is not subscriptable
Error in Python
Every programming language encounters many errors. Some occur at the compile time, some at run time.
This article will discuss the TypeError: 'map' object is not subscriptable
, a sub-class of TypeError
. We encounter a TypeError
when we try to perform an operation incompatible with the type of object.
Cause of the TypeError: 'map' object is not subscriptable
Error in Python
Python 2 Map Operations in Python 3
In Python 2, the map()
method returns a list. We can access the list’s elements using their index through the subscriptor operator []
.
In Python 3, the map()
method returns an object which is an iterator and cannot be subscripted. If we try to access the item using the subscript operator []
, the TypeError: 'map' object is not subscriptable
will be raised.
Example Code:
#Python 3.x
my_list = ["1", "2", "3", "4"]
my_list = map(int, my_list)
print(type(my_list))
my_list[0]
Output:
#Python 3.x
<class 'map'>
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-1-07511913e32f> in <module>()
2 my_list = map(int, my_list)
3 print(type(my_list))
----> 4 my_list[0]
TypeError: 'map' object is not subscriptable
Fix the TypeError: 'map' object is not subscriptable
Error in Python
Convert the Map Object to List in Python 3
If we convert the map object to a list using the list()
method, we can use the subscript operator/list methods.
Example Code:
#Python 3.x
my_list = ["1", "2", "3", "4"]
my_list = list(map(int, my_list))
print(my_list[0])
Output:
Use the for
Loop With Iterator in Python 3
We can access the items in the iterator using a for
loop. It calls the __next__()
method at the back and prints all the values.
Example Code:
#Python 3.x
my_list = ["1", "2", "3", "4"]
my_list = list(map(int, my_list))
for i in my_list:
print(i)
Output:
I have beed playing around the checkio and in one of the tasks I have used the following construction:
res = list(map(lambda i: i == l[0], l))
For one of the test cases l
was empty, so l[0]
should have resulted in an IndexError
, but for some reason map
function processed it correctly and the final result was an empty list.
Could someone explain why the execution did not result in IndexError
? Is it something to do with how map
processes the errors ?
asked Sep 27, 2022 at 9:47
4
map
does not handle exceptions itself; they will be raised as normal. The reason this code is not throwing an IndexError
is much less mysterious.
l[0]
only results in an IndexError
if that code is actually executed. It’s executed once for every element in the list l
, so if l
is empty, l[0]
is never executed at all, and so no IndexError
is raised.
answered Sep 27, 2022 at 9:57
ThomasThomas
175k51 gold badges358 silver badges481 bronze badges
2
If you have recently encountered the error message “TypeError: ‘map’ object is not subscriptable” in your Python code, you are not alone. This error occurs when you try to access a specific element in a map object using square brackets, but map objects do not support this operation.
Here are some ways to work around this issue:
1. Convert map object to list
One way to access specific elements in a map object is to convert it to a list first. This will allow you to use square brackets to access individual elements.
my_map = map(str.upper, ['hello', 'world'])
my_list = list(my_map)
print(my_list[0]) # Output: HELLO
2. Use a loop
Another way to work with map objects is to use a loop to iterate over each element. This is especially useful if you need to perform an operation on each element in the map object.
my_map = map(str.upper, ['hello', 'world'])
for element in my_map:
print(element)
# Output:
# HELLO
# WORLD
3. Use the next() function
You can also use the `next()` function to access the next element in the map object. This can be useful if you only need to access one element at a time.
my_map = map(str.upper, ['hello', 'world'])
print(next(my_map)) # Output: HELLO
print(next(my_map)) # Output: WORLD
Conclusion
In this guide, we have explored some ways to work around the “Python map object is not subscriptable ” error. By converting map objects to lists, using loops, or the next() function, you can access elements in the map object without encountering this error.