Dlaczego następujący skrypt wyświetla błąd:
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
stacja
źródło
źródło
payIntList = [int(x) + 1000 for x in payList]; print(*payIntList, sep='\n')
(lubfor x in payIntList: print x
w Pythonie 2.x, gdzieprint
nie jest funkcją) bez utraty czytelności (prawdopodobnie jest jeszcze bardziej czytelna).Odpowiedzi:
W Pythonie 3
map
zwraca iterowalny obiekt typumap
, a nie listę z indeksem, co pozwoliłoby na pisaniemap[i]
. Aby wymusić wynik listy, napiszpayIntList = list(map(int,payList))
Jednak w wielu przypadkach możesz lepiej napisać kod, nie używając indeksów. Na przykład ze składanymi listami :
payIntList = [pi + 1000 for pi in payList] for pi in payIntList: print(pi)
źródło
for i in payIntList: print(i + 1000)
map()
nie zwraca listy, zwracamap
obiekt.Musisz zadzwonić,
list(map)
jeśli chcesz, aby była to ponownie lista.Nawet lepiej,
from itertools import imap payIntList = list(imap(int, payList))
Nie zajmie dużo pamięci, tworząc obiekt pośredni, po prostu zemdleje podczas
ints
ich tworzenia.Możesz też to zrobić,
if choice.lower() == 'n':
aby nie robić tego dwa razy.Python obsługuje
+=
: możesz to zrobićpayIntList[i] += 1000
inumElements += 1
jeśli chcesz.Jeśli naprawdę chcesz być podstępny:
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
i / lub
for payInt in payIntList: payInt += 1000 print payInt
Ponadto cztery spacje to standardowa wielkość wcięcia w Pythonie.
źródło
list
wokół iteratora odbiera tę korzyść!list(map(...))
, tworzy amap
, tworzy alist
, a następnie usuwamap
, więc na chwilę oba są w pamięci jednocześnie. Kiedy to robisz,list(imap(...))
tak nie jest. Dlatego powiedziałem „weź pamięć za pomocą obiektu pośredniego ”list(map(...))
jest zbędny, ponieważ - jak stwierdza dokumentacja , „wynikiemmap
jest zawsze lista”.