Python지도 개체는 구독 할 수 없습니다.


83

다음 스크립트에서 오류가 발생하는 이유는 무엇입니까?

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]

5
Python 3을 사용하고 있습니까?
Felix Kling 2011-07-23

@ user567797-이것은 나를 위해 잘 작동합니다 @ Felix : 그는 print를 진술로 사용하고 있기 때문에 파이썬 3을 사용하지 않습니다!
Pushpak Dagade 2011

2
while 루프 아래의 모든 것은 가독성을 잃지 않고 payIntList = [int(x) + 1000 for x in payList]; print(*payIntList, sep='\n')(또는 함수가 아닌 for x in payIntList: print xPython 2.x에서 print) 단축 될 수 있습니다 (논란의 여지가 있지만 더 읽기 쉽습니다).

2
@Guanidene : 그는지도 객체를 가지고 있기 때문에 Python 3을 사용하고 있습니다. 그러나 그는 Python 2 코드를 실행하려고 시도하고 있으므로 오류가 발생합니다.
Lennart Regebro

3
"Python 3에서 Python 2 코드를 실행할 때 오류가 발생하는 이유는 무엇입니까?"라는 질문에이 모든 것을 중복으로 표시 할 수 있습니다. ;)
Lennart Regebro 2011

답변:


138

Python 3에서는 첨자 가능한 목록이 아니라 map유형의 반복 가능한 객체를 반환하므로 . 목록 결과를 강제하려면 다음을 작성하십시오.mapmap[i]

payIntList = list(map(int,payList))

그러나 대부분의 경우 인덱스를 사용하지 않으면 코드를 더 멋지게 작성할 수 있습니다. 예를 들어, list comprehensions :

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

6
이 대답은 정확하지만 이상적으로는 이와 같은 사용 사례를 위해 맵을 목록으로 변환하지 않을 것입니다. 맵은 이미 반복 가능하며 목록에 비해 반복하는 것이 훨씬 더 빠릅니다. 따라서 색인이 필요하지 않을뿐만 아니라 목록도 전혀 필요하지 않습니다. payIntList가 이미 맵이기 때문에 청소기 코드는 것for i in payIntList: print(i + 1000)
RustyToms

17

map()목록을 반환하지 않고 map객체를 반환 합니다.

list(map)다시 목록으로 만들려면 전화해야 합니다.

더 나은

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

중간 객체를 만드는 데 많은 메모리를 차지하지 않고 생성 할 때 전달 ints됩니다.

또한 if choice.lower() == 'n':두 번 할 필요가 없도록 할 수 있습니다 .

파이썬 지원 +=: 당신이 할 수있는 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

또한 4 개의 공백은 Python의 표준 들여 쓰기 양입니다.


1
python3의 경우이지만 여기서는 print를 명령문으로 사용하기 때문에 python2.x를 사용하는 것 같습니다.
Pushpak Dagade 2011

코드 조각 목록의 메모리에있는 모든 정수를 저장합니다. 반복기를 사용하는 것은 실제로 유용하고 특히 여러 계층의 변환에서 메모리를 절약하지만 list반복기를 추가 하면 이점이 사라집니다!

1
당신이 list(map(...))할 때 그것은 생성 map한 다음를 생성 한 list다음을 삭제 map하므로 잠시 동안 둘 다 한 번에 메모리에 있습니다. 당신 list(imap(...))이 할 때 이것은 사실이 아닙니다. I "는 함께 메모리를 차지했다 이유 중간 오브젝트"
AGF

그래서 파이썬 2를 가정하고 있습니까? 그런 list(map(...))때문에, 중복합니다 - 같은 문서 상태 "[의 결과는 map] 항상 목록입니다."
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.