Подтвердить что ты не робот

Объект карты 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]
4b9b3361

Ответ 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.