为什么以下脚本会出错:
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]
答案 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] += 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中的标准缩进量。
答案 2 :(得分:0)
在pypy3或python3中不需要为这个问题使用range,所以实际上代码更少..
for i in payIntList: print ( i + 1000 )
并且巧合地匹配了上面 PhiHag 解决方案中 RustyTom 的评论。注意:在 pypy3 或 python3 中不能使用数组括号 [] 引用地图,否则会抛出相同的错误。
payIntList[i]
地图引用导致错误。