Warum gibt das folgende Skript den Fehler aus:
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]
python
python-3.x
Bahnhof
quelle
quelle
payIntList = [int(x) + 1000 for x in payList]; print(*payIntList, sep='\n')
(oderfor x in payIntList: print x
in Python 2.x, woprint
es keine Funktion gibt) gekürzt werden, ohne die Lesbarkeit zu verlieren (wahrscheinlich ist es sogar noch besser lesbar).Antworten:
map
Gibt in Python 3 ein iterierbares Objekt vom Typmap
und keine abonnierbare Liste zurück, mit der Sie schreiben könnenmap[i]
. Schreiben Sie, um ein Listenergebnis zu erzwingenIn vielen Fällen können Sie Ihren Code jedoch viel besser ausschreiben, indem Sie keine Indizes verwenden. Zum Beispiel mit Listenverständnis :
payIntList = [pi + 1000 for pi in payList] for pi in payIntList: print(pi)
quelle
for i in payIntList: print(i + 1000)
map()
Gibt keine Liste zurück, sondern einmap
Objekt.Sie müssen anrufen,
list(map)
wenn Sie möchten, dass es wieder eine Liste ist.Noch besser,
from itertools import imap payIntList = list(imap(int, payList))
Nimmt nicht viel Speicherplatz in Anspruch, um ein Zwischenobjekt zu erstellen, sondern gibt es nur
ints
aus, wenn es erstellt wird.Sie können dies auch tun,
if choice.lower() == 'n':
damit Sie es nicht zweimal tun müssen.Python unterstützt
+=
: Sie könnenpayIntList[i] += 1000
undnumElements += 1
wenn Sie wollen.Wenn Sie wirklich knifflig sein wollen:
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
und / oder
for payInt in payIntList: payInt += 1000 print payInt
Außerdem sind vier Leerzeichen der Standard-Einrückungsbetrag in Python.
quelle
list
eines Iterators nimmt diesen Vorteil jedoch weg!list(map(...))
, wird ein erstelltmap
, dann ein erstelltlist
und dann das gelöschtmap
, sodass beide für eine Weile gleichzeitig im Speicher sind. Wenn Sie dies tun, istlist(imap(...))
dies nicht der Fall. Deshalb habe ich gesagt "Nehmen Sie Speicher mit einem Zwischenobjekt auf "list(map(...))
ist redundant, weil - wie in der Dokumentation angegeben , "das Ergebnis [vonmap
] immer eine Liste ist".