Python地图对象不可订阅

时间:2011-07-23 12:52:14

标签: python python-3.x

为什么以下脚本会出错:

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]

3 个答案:

答案 0 :(得分:88)

在Python 3中,map返回类型为map的可迭代对象,而不是可订阅列表,这将允许您编写map[i]。要强制列表结果,请写

payIntList = list(map(int,payList))

但是,在许多情况下,您可以通过不使用索引来更好地编写代码。例如,使用list comprehensions

payIntList = [pi + 1000 for pi in payList]
for pi in payIntList:
    print(pi)

答案 1 :(得分:13)

map()不返回列表,它返回map个对象。

如果您希望再次成为列表,则需要致电list(map)

更好,

from itertools import imap
payIntList = list(imap(int, payList))

不会占用一堆内存来创建一个中间对象,它只会在创建它们时传递ints

此外,您可以执行if choice.lower() == 'n':,因此您无需执行两次。

Python支持+=:如果需要,您可以payIntList[i] += 1000numElements += 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中的标准缩进量。

答案 2 :(得分:0)

在pypy3或python3中不需要为这个问题使用range,所以实际上代码更少..

for i in payIntList: print ( i + 1000 )

并且巧合地匹配了上面 PhiHag 解决方案中 RustyTom 的评论。注意:在 pypy3 或 python3 中不能使用数组括号 [] 引用地图,否则会抛出相同的错误。

payIntList[i] 

地图引用导致错误。