문의한 코드는 삭제합니다.
이렇게 작성하고 코드 입력할때 x에 값을 할당할때는 문제가 없는데 y에 입력 값을 할당하고 나서
TypeError: 'map' object is not subscriptable이라고 뜹니다 ㅠㅠ 어디가 잘못된건지 알려주시면 감사합니다 ㅠㅠ
(도장_ 관리자님이 수정함 - 원문 제출일: 2019년 1월 17일, 목요일, 오후 10:50)
파이썬 IDLE을 사용해서 코드를 하나별로 테스트하고 실습해서 문제가 없는지 확인하세요.
문의한 코드의 첫 번째 줄 x는 입력이 잘 되고, 결과는 list 타입입니다.
type(x)로 확인하면 타입을 알 수 있고, x만 입력하면 리스트가 출력되는 걸 볼 수 있습니다.
두 번째 줄 y는 입력이 잘 되고, 결과는 map 타입입니다.
y만 입력하면 map object로 표시되고, type(y)를 하면 map 클래스라고 표시됩니다. 즉, 요소가 있는 리스트 객체가 아닙니다. map 객체는 원소를 하나씩 반환할 수는 있지만 [] 연산자를 쓸 수 없습니다. y[0]처럼 써서 접근할 수 없고, y[0:2] 같은 슬라이스도 쓸 수 없습니다.
map 객체에 슬라이스는 쓰지 않습니다. 안 쓰면 됩니다. ^^. UNIT 12까지 설명되어 있지 않은 내용입니다. 설명되지 않은 내용으로 심사문제를 풀게 하지는 않습니다.
zip(x, y)면 충분합니다.
<파이썬 코딩 도장>은 '반복 가능한'(iterable)이라는 개념을 UNIT 16부터 시작해서 매우 반복해서 설명합니다.(반복 가능한 개념을 설명하지 않는 책이 더 많습니다. 그러나 파이썬 표준에서는 매우 중요한 개념입니다).
list와 map은 모두 반복 가능한 객체입니다. zip 함수는 반복 가능한 객체를 사용합니다.
그다음으로 등장하는 개념은 첨자 가능한(subscriptable)이라는 개념입니다. []는 첨자 연산자(subscript operator)라고 부릅니다.
a = [1,2,3,4]가 있다면 a[0]처럼 첫 번째 원소를 가리키는 것이 첨자 연산자의 역할입니다. 파이썬은 슬라이스를 사용해 범위까지 가르킬 수 있습니다.
map 객체는 첨자 연산자는 쓸 수 없습니다. 즉, not subscriptable이라고 합니다. 그러나 원소를 하나씩 꺼내는 것은 가능하므로 반복 가능한(iterable)이라고 합니다.
UNIT 39.1에 그림과 함께 반복 가능한 객체를 모두 정리해서 설명합니다. 순서대로 학습하면 모두 익힐 수 있습니다.
zip(x, y)를 하면 잘 되는 것을 확인할 수 있습니다. zip에는 반복 가능한 객체만 쓸 수 있고, y는 첨자 연산이 안 되는데 나는 y[:] 형식을 쓰고 싶다면 반복 가능한 객체로 바꾸면 됩니다.
list(y)로 하면 반복 가능한 객체로 바뀝니다.
>>> yy = list(y)
>>> yy
[575.6, 1.7, 338.8, 1.63]
>>> type(yy)
<class 'list'>
>>> yy[:]
[575.6, 1.7, 338.8, 1.63]
>>>
list(y)로 변환한 yy는 이제 리스트 객체입니다. yy[:] 같은 슬라이스도 사용할 수 있습니다. 이제 dict(zip()) 조합에 넣을 수 있죠.
>>> dict(zip(x[:], y[:]))
Traceback (most recent call last):
File "<pyshell#13>", line 1, in <module>
dict(zip(x[:], y[:]))
TypeError: 'map' object is not subscriptable
>>> dict(zip(x[:], yy[:]))
{'health': 575.6, 'health_regen': 1.7, 'mana': 338.8, 'mana_regen': 1.63}
>>>
둘 다 리스트인 두 번째는 슬라이스 연산자를 써도 문제가 없습니다.
답변해주셔서 감사합니다!! 근데 zip에 묶어야 하는경우 둘다 리스트일때 zip으로 묶은 뒤, 마지막에 딕셔너리로 출력하는 거 아닌가요?? 설명해주신걸로 이해되는데 map(x, y) 이부분에서 y부분이 너무 찜찜하네요 ㅠㅠ 그냥 자연스럽게 넘기면 되는건가요?
아,,ㅠ 위에 오타났습니다..답변해주셔서 감사합니다!! 근데 zip에 묶어야 하는경우 둘다 리스트일때 zip으로 묶은 뒤, 마지막에 딕셔너리로 출력하는 거 아닌가요?? 설명해주신걸로 이해되는데 zip(x, y) 이부분에서 y부분이 너무 찜찜하네요 ㅠㅠ y가타입이 map인데 ,,리스트로 넣어야하는거 같기도 하구요 ㅠㅠ 그냥 자연스럽게 넘기면 되는건가요?
zip은 리스트만 쓰는 함수가 아닙니다. 반복 가능한 객체면 다 쓸 수 있습니다. 따라서 map 객체도 쓸 수 있습니다. 잘못된 게 아닙니다.
또한, 나중에 내가 만든 객체도 반복 가능한 객체로 만들면 zip과 같이 쓸 수 있습니다. UNIT 39에서 이터레이터(반복자)를 직접 만들어 보게 됩니다.