Объект карты Python не подлежит расшифровке
Почему следующая ошибка script дает ошибку:
payIntList[i] = payIntList[i] + 1000
TypeError: 'map' object is not subscriptable
payList = []
numElements = 0
while True:
payValue = raw_input("Enter the pay amount: ")
numElements = numElements + 1
payList.append(payValue)
choice = raw_input("Do you wish to continue(y/n)?")
if choice == 'n' or choice == 'N':
break
payIntList = map(int,payList)
for i in range(numElements):
payIntList[i] = payIntList[i] + 1000
print payIntList[i]
Ответы
Ответ 1
В Python 3, map
возвращает итерируемый объект типа map
, а не подстрочный список, который позволит вам написать map[i]
. Чтобы заставить результат списка, напишите
payIntList = list(map(int,payList))
Однако во многих случаях вы можете написать код лучше, не используя индексы. Например, с списком понятий:
payIntList = [pi + 1000 for pi in payList]
for pi in payIntList:
print(pi)
Ответ 2
map()
не возвращает список, он возвращает объект map
.
Вам нужно позвонить list(map)
, если вы хотите, чтобы он снова был списком.
Еще лучше,
from itertools import imap
payIntList = list(imap(int, payList))
Не будет занимать кучу памяти, создавая промежуточный объект, он просто передаст ints
, поскольку он создает их.
Кроме того, вы можете сделать if choice.lower() == 'n':
, поэтому вам не нужно делать это дважды.
Python поддерживает +=
: вы можете сделать payIntList[i] += 1000
и numElements += 1
, если хотите.
Если вы действительно хотите быть сложным:
from itertools import count
for numElements in count(1):
payList.append(raw_input("Enter the pay amount: "))
if raw_input("Do you wish to continue(y/n)?").lower() == 'n':
break
и/или
for payInt in payIntList:
payInt += 1000
print payInt
Кроме того, четыре пробела являются стандартным количеством отступа в Python.