Computer >> 컴퓨터 >  >> 프로그램 작성 >> Python

Python TypeError:해시할 수 없는 유형:'dict' 솔루션

Python 언어는 사전에서 키로 사용할 수 있는 항목에 대해 구체적입니다. Python 사전에서 모든 키는 해시 가능해야 합니다.

사전에 키를 추가할 때 해시할 수 없는 키 유형을 사용하려고 하면 "TypeError:해시할 수 없는 유형:'dict'" 오류가 발생합니다.

이 가이드에서는 이 오류의 의미와 발생 이유에 대해 설명합니다. 코드에서 이 오류를 해결하는 방법을 배울 수 있도록 이 오류의 예를 살펴봅니다.

TypeError:해시할 수 없는 유형:'dict'

사전은 키와 값의 두 부분으로 구성됩니다. 키는 값에 바인딩된 식별자입니다. 키를 참조하면 해당 키와 연결된 값을 검색할 수 있습니다.

해시 가능한 개체만 사전의 키가 될 수 있습니다. 문자열, 정수, 튜플 및 frozenset과 같은 변경할 수 없는 개체는 몇 가지 예외를 제외하고 해시 가능합니다. 따라서 사전은 사전에서 키로 사용할 수 없습니다.

사전에 항목을 추가하려면 유효한 해시 가능 키를 지정해야 합니다. 예를 들어 "name"은 유효한 키이지만 { "name":"test" }는 유효한 키가 아닙니다.

예시 시나리오

여기서는 빵집에서 5번 이상 판매된 모든 케이크를 한 사전에서 다른 사전으로 추가하는 프로그램을 작성합니다.

각 케이크에 대한 사전이 포함된 케이크 목록을 선언하는 것으로 시작합니다. 또한 5회 이상 판매된 케이크를 저장할 수 있는 사전도 정의합니다.

참가자의 81%는 부트캠프에 참석한 후 기술 직업 전망에 대해 더 자신감을 느꼈다고 말했습니다. 지금 부트캠프에 참여하십시오.

부트캠프 졸업생은 부트캠프 시작부터 첫 직장을 찾는 데까지 6개월도 채 걸리지 않았습니다.

cakes = [
	{
"name": "Black Forest Gateau", "sold": 3
},
{
"name": "Carrot Cake", "sold": 7
},
{
"name": "Coconut and Lime Cake", "sold": 9
}
]
sold_more_than_five = {}

우리의 "케이크" 목록에는 3개의 사전이 있습니다. 각 사전에는 두 개의 키와 값이 있습니다. 주요 이름은 "케이크"와 "판매"입니다.

이제 케이크 목록을 살펴보고 다섯 번 이상 판매된 케이크를 찾는 for 루프를 작성합니다. 해당 케이크는 "sold_more_than_five" 사전에 추가됩니다.

for c in cakes:
	if c["sold"] > 5:
		sold_more_than_five[c] = c["sold"]
		print(c["name"] + " has been sold more than five times.")

print(sold_more_than_five)

for 루프에서 각 사전의 "sold" 값이 5보다 큰지 비교합니다. 그렇다면 해당 항목은 "sold_more_than_five" 사전에 추가됩니다. 그런 다음 특정 케이크가 5번 이상 판매되었음을 알리는 메시지가 콘솔에 인쇄됩니다.

루프가 실행되면 "sold_more_than_five" 사전을 콘솔에 인쇄합니다.

코드를 실행하여 프로그램이 작동하는지 확인하십시오.

Traceback (most recent call last):
  File "main.py", line 16, in <module>
	sold_more_than_five[c] = c["sold"]
TypeError: unhashable type: 'dict'

코드가 오류를 반환합니다.

해결책

다른 사전을 사용하여 사전 키를 생성하려고 하기 때문에 코드가 작동하지 않습니다.

"c"의 값은 "케이크" 목록의 사전과 같습니다. 이것은 "sold_more_than_five" 사전에 항목을 추가하려고 할 때 실수로 사전을 키로 추가하려고 시도한다는 것을 의미합니다.

sold_more_than_five[c] = c["sold"]

"if" 문이 "Carrot Cake" 케이크에서 실행될 때 코드는 다음을 실행하려고 합니다.

sold_more_than_five[{"name": "Carrot Cake", "sold": 7}] = 7

사전의 키로 사전을 추가하려고 하기 때문에 유효하지 않습니다. c["name"]을 사전 키의 이름으로 사용하여 이 문제를 해결할 수 있습니다.

sold_more_than_five[c["name"]] = c["sold"]

이 수정된 코드로 코드를 실행하십시오.

Carrot Cake has been sold more than five times.
Coconut and Lime Cake has been sold more than five times.

{'Carrot Cake': 7, 'Coconut and Lime Cake': 9}

코드가 성공적으로 실행됩니다. 이제 각 케이크의 이름을 사전이 아닌 키로 사용하고 있습니다.

결론

"TypeError:unhashable type:'dict'" 오류는 key가 unhashable 객체인 딕셔너리에서 항목을 생성하려고 하면 발생합니다. 문자열, 튜플 및 정수와 같은 변경할 수 없는 개체만 사전에서 키로 사용할 수 있습니다.

이 오류를 해결하려면 사전에 항목을 생성할 때 해시 가능한 개체만 사용해야 합니다. 이제 전문 개발자처럼 이 일반적인 Python 오류를 해결할 준비가 되었습니다!