Объект карты Python не является подписным - PullRequest
53 голосов
/ 23 июля 2011

Почему следующий скрипт выдает ошибку:

payIntList[i] = payIntList[i] + 1000<br> 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]

Ответы [ 2 ]

91 голосов
/ 23 июля 2011

В Python 3 map возвращает итеративный объект типа map, а не список подписчиков, что позволило бы написать map[i]. Чтобы вызвать результат списка, напишите

payIntList = list(map(int,payList))

Тем не менее, во многих случаях вы можете написать свой код лучше, не используя индексы. Например, с списком пониманий :

payIntList = [pi + 1000 for pi in payList]
for pi in payIntList:
    print(pi)
13 голосов
/ 23 июля 2011

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...