Как устранить ошибку? "map" object is not subscriptable
Пользователь вводит последовательность из чисел, нужно определить, является последовательность монотонно возрастающей или убывающей(в т.ч. и нестрого) и вывести "Да" или "Нет". При запуске программы выдает
'map' object is not subscriptable.
Что нужно исправить, чтобы заработало?
a = map(int, input().split(" "))
prev = a[0]
flag = True
for i in a[1:]:
if prev <= i:
prev = i
else:
flag = False
break
if flag: print("Yes")
else: print("No")
Ответы (1 шт):
Что такое 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
Альтернатива
В питоне также есть comprehensions - это способ инициализировать что-то, в нашем случае список:
>>> [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.
(как по мне, comprehensions намного более интуитивные :] )