Python 사전은 해시 가능한 데이터 유형만 사전의 키로 허용합니다. 목록은 해시 가능한 데이터 유형이 아닙니다. 사전에서 목록을 키로 지정하면 "TypeError:unhashable type:'list'" 오류가 발생합니다.
이 가이드에서는 이 오류의 의미와 코드에서 오류가 표시되는 이유에 대해 설명합니다. 이 오류를 해결하는 방법을 보여주기 위해 이 오류의 예를 살펴보겠습니다.
TypeError:해시할 수 없는 유형:'목록'
사전에는 키와 값의 두 부분이 있습니다. 키는 특정 값과 연결된 레이블입니다. 값에 액세스하려면 해당 값의 키 이름을 참조해야 합니다.
값은 목록에서 문자열에 이르기까지 모든 데이터 유형이 될 수 있지만 해시 가능한 개체만 키로 허용됩니다. 해시 가능한 객체는 시간이 지나도 변하지 않는 해시 값을 가진 객체입니다. 해시 가능한 객체의 예로는 튜플과 문자열이 있습니다.
목록에는 변경되지 않는 해시 값이 없습니다. 해시 값은 시간이 지남에 따라 변경될 수 있습니다. 즉, 목록을 사전 키로 지정할 수 없습니다.
예시 시나리오
평균 성적이 75점 이상인 학생의 목록을 만드는 프로그램을 작성해 보겠습니다. 이 목록에는 각 학생의 사전 기록과 성적이 포함됩니다. 이 사전을 만들기 위해 우리는 학교의 모든 학생과 그들의 성적 목록이 있는 사전에서 작업할 것입니다.
우선 학생 목록과 최고의 학생을 위한 사전을 정의해 보겠습니다.
students =[ { "name":"Linda", "grades":[84, 82, 65] }, { "name":"Alex", "grades":[67, 68, 83] }, { "name":"Holly", "grades":[72, 74, 81] }]top_students ={}
"학생" 목록의 각 값은 사전입니다. 각 사전에는 이름과 등급이라는 두 개의 키가 있습니다. 우리는 최고의 학생에 대한 정보를 포함할 "top_students"라는 사전을 정의했습니다.
참가자의 81%는 부트캠프에 참석한 후 기술 직업 전망에 대해 더 자신감을 느꼈다고 말했습니다. 지금 부트캠프에 참여하십시오.
부트캠프 졸업생은 부트캠프 시작부터 첫 직장을 찾는 데까지 6개월도 채 걸리지 않았습니다.
이 사전을 정의했으므로 for 루프를 사용하여 평균 성적이 75점 이상인 학생을 걸러내고 새 사전에 추가합니다.
학생의 경우:평균 =sum(s["grades"]) / len(s["grades"]) if average> 75:top_students[s["grades"]] =s["name"]
for 루프를 반복할 때마다 학생이 얻은 모든 성적의 평균을 계산합니다. 모든 성적의 합계를 기록된 성적 수로 나누어 이를 수행합니다.
다음으로, 평균이 75보다 큰지 확인합니다. 그렇다면 학생의 이름과 성적으로 top_students 사전에 새 항목을 만듭니다.
마지막으로 top_students 사전을 콘솔에 출력하여 평균 성적이 75점 이상인 모든 학생을 볼 수 있습니다.
print(top_students)
코드를 실행하고 어떤 일이 일어나는지 확인하십시오.
추적(가장 최근 호출 마지막):파일 "main.py", 줄 11,top_students[s["grades"]] =s["name"]TypeError:해시할 수 없는 유형:'list'사전> 코드가 성공적으로 실행되지 않습니다.
해결책
우리 코드는 인터프리터가 11번째 줄에 도달할 때까지 작동합니다. 이 줄에서 코드는 다음과 같이 말합니다.
상위_학생[s["grades"]] =s["name"]코드의 오류는 목록을 사전의 키로 할당하려고 시도했기 때문입니다. 코드가 루프의 첫 번째 반복에서 이 줄을 구문 분석할 때 코드는 다음 키와 값으로 사전을 만들려고 시도합니다.
{ [84, 82, 65]:"린다" }잘못된 사전입니다. 우리 코드는 작동하지 않는 키로 목록을 할당하려고 합니다.
이 문제를 해결하기 위해 사전의 키로 성적 목록 대신 학생 이름을 사용합니다.
top_students[s["name"]] =s["grades"]등급 목록을 키 대신 값으로 할당했습니다. 학생의 이름은 사전의 열쇠입니다. 코드를 실행해 보겠습니다.
{'린다':[84, 82, 65], '홀리':[72, 74, 81]}우리의 코드는 성적이 우수한 학생에 대한 정보가 포함된 사전을 성공적으로 생성합니다. 지난 세 번의 시험에서 평균 점수가 75점 이상인 학생은 사전에 추가되었습니다.
사전은 다음과 같이 분류됩니다.
- 열쇠:린다, 홀리
- 값:[84, 82, 65], [72, 74, 81]
이제 키 이름에 문자열을 할당하기 때문에 코드가 작동합니다.
결론
"TypeError:unhashable type:'list'" 오류는 사전에서 목록을 키로 할당하려고 하면 발생합니다. 이 오류를 해결하려면 문자열이나 튜플과 같은 해시 가능한 개체만 사전의 키로 할당해야 합니다.
이제 전문 코더처럼 이 오류를 해결할 준비가 되었습니다!