찾다
백엔드 개발파이썬 튜토리얼Python에서 TypeError:unhashable type:'dict' 오류를 해결하는 방법

Python “TypeError: unhashable type: ‘dict’”는 사전을 다른 사전의 키로 사용하거나 컬렉션의 요소로 사용할 때 발생합니다.

이 오류를 해결하려면 대신 frozenset을 사용하거나 사전을 키로 사용하기 전에 사전을 JSON 문자열로 변환해야 합니다. frozenset,或者在将字典用作键之前将其转换为 JSON 字符串。

当我们将字典用作另一个字典中的键时,会发生错误。

# ????️ using dictionary as a key in a dictionary

# ⛔️ TypeError: unhashable type: 'dict'
my_dict = {'name': 'Jiyik', {'country': 'China'}: 'address'}

或者当我们使用字典作为 set 对象中的元素时。

# ????️ 使用字典作为集合中的元素

# ⛔️ TypeError: unhashable type: 'dict'
my_set = {{'name': 'Jiyik'}}

我们不能将字典用作字典中的键或集合中的元素,因为字典对象是可变的和不可散列的。

将字典转为JSON字符串解决报错

解决该错误的一种方法是在将字典用作键之前将其转换为 JSON 字符串。

import json

# ????️ 将字典转换为 JSON 字符串
my_json = json.dumps({'country': 'China'})

my_dict = {'name': 'Jiyik', my_json: 'address'}
print(my_dict)  # ????️ {'name': 'Jiyik', '{"country": "China"}': 'address'}

# ????️ 当你必须访问字典中的键时
print(my_dict[json.dumps({'country': 'Austria'})]) # ????️ address

json.dumps 方法将 Python 对象转换为 JSON 格式的字符串。 这是有效的,因为字符串是不可变的和可散列的。

相反,json.loads 方法将 JSON 字符串解析为本机 Python 对象,例如 my_dict = json.loads(my_json_str)

使用 frozenset 解决错误

解决错误的另一种方法是使用 frozenset

my_key = {'country': 'China'}
key = frozenset(my_key.items())
print(key)  # ????️ frozenset({('country', 'China')})

my_dict = {'name': 'Jiyik', key: 'address'}


# ????️ 当我们必须访问 key 时
print(my_dict[frozenset(my_key.items())])  # ????️ 'address'

dict.items 方法返回字典项((键,值)对)的新视图。

# ????️ dict_items([('name', 'jiyik'), ('age', 30)])
print({'name': 'jiyik', 'age': 30}.items())

我们使用字典的项目创建了一个 frozenset,我们可以将其用作字典中的键(以及另一个集合中的元素)。

frozenset 是 Python 集合对象的不可变版本,因此它可以用作字典中的键或另一个集合中的元素。

请注意 ,我们必须使用相同的方法来访问字典中的键。

我们可以将调用 frozenset(my_key.items()) 的结果存储在变量中,并在设置或访问字典中的键时重用 frozenset。

将字典转换为元组以解决错误

解决错误的另一种方法是将字典转换为元组。

dict_key = {'id': 1, 'country': 'China'}

# ✅ 转换为元组
my_tuple = tuple(dict_key)
print(my_tuple)  # ????️ ('id', 'country')

my_dict = {'name': 'Jiyik', my_tuple: 'address'}
print(my_dict)  # ????️ {'name': 'Jiyik', ('id', 'country'): 'address'}

# ????️ 当你必须访问字典中的键时
print(my_dict[my_tuple])  # ????️ address

将字典转换为元组时,元组仅包含字典的键。

元组是不可变的,因此包含字典键的元组可以安全地用作另一个字典中的键。

使用一个字典作为另一个字典中的值

我们不能将一个字典用作另一个字典中的键,但可以将一个字典用作值。

dict_value = {'id': 1, 'country': 'China'}

my_dict = {'name': 'Jiyik', 'data': dict_value}

# ????️ {'name': 'Jiyik', 'data': {'id': 1, 'country': 'China'}}
print(my_dict)

print(my_dict['data'])  # ????️ {'id': 1, 'country': 'China'}

我们将一个字典设置为另一个字典中的值。

这是允许的,因为限制不适用于字典值。

将一个字典的所有键值对添加到另一个字典

如果需要将一个字典的所有键值对添加到另一个字典,则可以使用 for 循环。

another_dict = {'id': 1, 'country': 'China'}

my_dict = {'name': 'Jiyik'}

for key, value in another_dict.items():
    my_dict[key] = value

# ????️ {'name': 'Jiyik', 'id': 1, 'country': 'China'}
print(my_dict)

dict.items 方法返回字典项((键,值)对)的新视图。

my_dict = {'id': 1,  'name': 'Jiyik'}

# ????️ dict_items([('id', 1), ('name', 'Jiyik')])
print(my_dict.items())

在每次迭代中,我们将键值对设置为另一个字典。

Python 中的可散列对象与不可散列对象

Python 中的大多数不可变内置对象都是可散列的,而可变对象是不可散列的。

如果一个对象是可散列的,那么它可以用作字典中的键和集合中的元素,因为这些数据结构在内部使用散列值。

可哈希对象包括 - strintbooltuplefrozenset

不可散列的对象包括 - listdictset

请注意,元组和冻结集仅在其元素可哈希时才可哈希。

检查一个对象是否可散列

我们可以通过将对象传递给内置的 hash() 函数来检查对象是否可散列。

print(hash('jiyik.com'))  # ????️ 4905958875846995527

# ⛔️ TypeError: unhashable type: 'dict'
print(hash({'name': 'Jiyik'}))

Python에서 TypeError:unhashable type:dict 오류를 해결하는 방법

散列函数返回传入对象的散列值(如果有的话)。

哈希值是整数,用于在字典查找期间比较字典键。

!> 可散列对象的散列值在其生命周期内永远不会改变。 这就是为什么大多数不可变对象是可哈希的,而可变对象是不可哈希的。

像字典这样的对象是可变的,因为字典的内容可以改变。

my_dict = {'name': 'Fql'}

my_dict['name'] = 'Jiyik'

print(my_dict) # ????️ {'name': 'Jiyik'}

另一方面,包含原始值的 fronzenset 和元组对象是不可变的(和可散列的)。

字典由键索引,字典中的键可以是任何不可变类型,例如 字符串或数字。

如果元组包含字符串、数字或元组,则它们只能用作字典中的键。

如果 fronzenset 或元组包含可变对象(例如列表),则不能将其用作字典中的键或集合中的元素。

如果我们不确定变量存储的对象类型,请使用 type() 函数。

my_dict = {'name': 'Jiyik'}

print(type(my_dict))  # ????️ <class &#39;dict&#39;>
print(isinstance(my_dict, dict))  # ????️ True

my_str = &#39;jiyik.com&#39;

print(type(my_str))  # ????️ <class &#39;str&#39;>
print(isinstance(my_str, str))  # ????️ True

type

사전을 다른 사전의 키로 사용하면 오류가 발생합니다. 🎜rrreee🎜 또는 사전을 set 객체의 요소로 사용할 때. 🎜rrreee
🎜사전 객체는 변경 가능하고 해시 불가능하므로 사전을 사전의 키나 컬렉션의 요소로 사용할 수 없습니다. 🎜

사전을 JSON 문자열로 변환하여 오류 해결

🎜이 오류를 해결하는 한 가지 방법은 사전을 키로 사용하기 전에 JSON 문자열로 변환하는 것입니다. 🎜rrreee🎜json.dumps 메서드는 Python 객체를 JSON 형식 문자열로 변환합니다. 이는 문자열이 불변이고 해시 가능하기 때문에 작동합니다. 🎜🎜반대로 json.loads 메서드는 JSON 문자열을 my_dict = json.loads(my_json_str)와 같은 기본 Python 개체로 구문 분석합니다. 🎜

frozenset을 사용하여 오류 해결

🎜오류를 해결하는 또 다른 방법은 frozenset을 사용하는 것입니다. 🎜rrreee🎜dict.items 메서드는 사전 항목((키, 값) 쌍)의 새로운 보기를 반환합니다. 🎜rrreee🎜사전의 항목을 사용하여 사전의 키(및 다른 세트의 요소)로 사용할 수 있는 frozenset를 만듭니다. 🎜
🎜frozenset은 Python 컬렉션 객체의 불변 버전이므로 사전의 키 또는 다른 컬렉션의 요소로 사용할 수 있습니다. 🎜
🎜🎜참고🎜 사전의 키에 액세스하려면 동일한 방법을 사용해야 합니다. 🎜
🎜frozenset(my_key.items()) 호출 결과를 변수에 저장하고 사전의 키를 설정하거나 액세스할 때 Frozenset을 재사용할 수 있습니다. 🎜

사전을 튜플로 변환하여 오류 해결

🎜오류를 해결하는 또 다른 방법은 사전을 튜플로 변환하는 것입니다. 🎜rrreee🎜사전을 튜플로 변환할 때 튜플에는 사전의 키만 포함됩니다. 🎜🎜튜플은 불변이므로 사전 키를 포함하는 튜플을 다른 사전의 키로 안전하게 사용할 수 있습니다. 🎜

한 사전을 다른 사전의 값으로 사용

🎜사전을 다른 사전의 키로 사용할 수 없지만 사전을 값으로 사용할 수는 있습니다. 🎜rrreee🎜사전을 다른 사전의 값으로 설정합니다. 🎜🎜사전 값에는 제한이 적용되지 않기 때문에 허용됩니다. 🎜

한 사전의 모든 키-값 쌍을 다른 사전에 추가

🎜한 사전의 모든 키-값 쌍을 다른 사전에 추가해야 하는 경우 for 루프를 사용할 수 있습니다. 🎜rrreee🎜dict.items 메서드는 사전 항목((키, 값) 쌍)의 새로운 보기를 반환합니다. 🎜rrreee🎜각 반복마다 키 값 쌍을 다른 사전으로 설정합니다. 🎜

Python의 해시 가능한 개체와 해시 불가능한 개체

🎜Python의 대부분의 불변 내장 개체는 해시 가능하지만 변경 가능한 개체는 해시 가능하지 않습니다. 🎜
🎜객체가 해시 가능한 경우 해당 데이터 구조는 내부적으로 해시 값을 사용하므로 사전의 키와 컬렉션의 요소로 사용할 수 있습니다. 🎜
🎜해시 가능한 개체에는 🎜str🎜 , 🎜int🎜 , 🎜bool🎜 , 🎜tuple🎜 , 🎜frozenset🎜이 포함됩니다. 🎜🎜해싱할 수 없는 개체에는 🎜list🎜, 🎜dict🎜, 🎜set🎜이 포함됩니다. 🎜
🎜🎜참고🎜 튜플과 고정 집합은 해당 요소가 해시 가능한 경우에만 해시 가능합니다. 🎜

객체가 해시 가능한지 확인

🎜객체를 내장된 hash() 함수에 전달하여 객체가 해시 가능한지 확인할 수 있습니다. 🎜rrreee🎜Python에서 TypeError:unhashable type:'dict' 오류를 해결하는 방법🎜🎜해시 함수는 전달된 객체(있는 경우)의 해시 값을 반환합니다. 🎜🎜해시 값은 사전 조회 중에 사전 키를 비교하는 데 사용되는 정수입니다. 🎜🎜!> 해시 가능한 객체의 해시 값은 수명 동안 절대 변하지 않습니다. 이것이 대부분의 불변 객체가 해시 가능한 반면, 가변 객체는 해시 가능하지 않은 이유입니다. 🎜🎜사전과 같은 객체는 사전의 내용이 바뀔 수 있기 때문에 변경 가능합니다. 🎜rrreee🎜 반면에 원시 값을 포함하는 fronzenset 및 튜플 객체는 불변(그리고 해시 가능)합니다. 🎜🎜사전은 키로 인덱싱되며 사전의 키는 문자열이나 숫자 등 변경할 수 없는 유형일 수 있습니다. 🎜
🎜튜플은 문자열, 숫자 또는 튜플을 포함하는 경우에만 사전의 키로 사용할 수 있습니다. 🎜
🎜fronzenset 또는 튜플에 변경 가능한 개체(예: 목록)가 포함된 경우 사전의 키나 집합의 요소로 사용할 수 없습니다. 🎜🎜변수에 저장된 객체의 유형이 확실하지 않은 경우 type() 함수를 사용하세요. 🎜rrreee🎜type 이 함수는 개체의 유형을 반환합니다. 🎜

전달된 개체가 전달된 클래스의 인스턴스 또는 하위 클래스인 경우 isinstance 함수는 True를 반환합니다.

위 내용은 Python에서 TypeError:unhashable type:'dict' 오류를 해결하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명
이 기사는 亿速云에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제
파이썬 어레이를 어떻게 슬라이스합니까?파이썬 어레이를 어떻게 슬라이스합니까?May 01, 2025 am 12:18 AM

Python List 슬라이싱의 기본 구문은 목록 [start : stop : step]입니다. 1. Start는 첫 번째 요소 인덱스, 2.Stop은 첫 번째 요소 인덱스가 제외되고 3. Step은 요소 사이의 단계 크기를 결정합니다. 슬라이스는 데이터를 추출하는 데 사용될뿐만 아니라 목록을 수정하고 반전시키는 데 사용됩니다.

어떤 상황에서 목록이 배열보다 더 잘 수행 될 수 있습니까?어떤 상황에서 목록이 배열보다 더 잘 수행 될 수 있습니까?May 01, 2025 am 12:06 AM

ListSoutPerformArraysin : 1) DynamicsizingandFrequentInsertions/Deletions, 2) StoringHeterogeneousData 및 3) MemoryEfficiencyForsParsEdata, butMayHavesLightPerformanceCosceperationOperations.

파이썬 어레이를 파이썬 목록으로 어떻게 변환 할 수 있습니까?파이썬 어레이를 파이썬 목록으로 어떻게 변환 할 수 있습니까?May 01, 2025 am 12:05 AM

TOCONVERTAPYTHONARRAYTOALIST, USETHELIST () CONSTUCTORORAGENERATERATOREXPRESSION.1) importTheArrayModuleAndCreateAnarray.2) USELIST (ARR) 또는 [XFORXINARR] TOCONVERTITTOALIST.

Python에 목록이있을 때 배열을 사용하는 목적은 무엇입니까?Python에 목록이있을 때 배열을 사용하는 목적은 무엇입니까?May 01, 2025 am 12:04 AM

chooSearRaysOverListSinpyTonforBetTerferformanceAndMemoryEfficiencyInspecificscenarios.1) arrgenumericalDatasets : arraysreducememoryUsage.2) Performance-CriticalOperations : ArraysofferspeedboostsfortaskslikeApenorsearching.3) TypeSenforc

목록과 배열의 요소를 반복하는 방법을 설명하십시오.목록과 배열의 요소를 반복하는 방법을 설명하십시오.May 01, 2025 am 12:01 AM

파이썬에서는 루프에 사용하여 열거 및 추적 목록에 대한 이해를 나열 할 수 있습니다. Java에서는 루프를 위해 전통적인 사용 및 루프가 트래버스 어레이를 향해 향상시킬 수 있습니다. 1. Python 목록 트래버스 방법에는 다음이 포함됩니다. 루프, 열거 및 목록 이해력. 2. Java 어레이 트래버스 방법에는 다음이 포함됩니다. 루프 용 전통 및 루프를위한 향상.

Python Switch 문은 무엇입니까?Python Switch 문은 무엇입니까?Apr 30, 2025 pm 02:08 PM

이 기사는 버전 3.10에 도입 된 Python의 새로운 "매치"진술에 대해 논의하며, 이는 다른 언어로 된 문장과 동등한 역할을합니다. 코드 가독성을 향상시키고 기존 IF-ELIF-EL보다 성능 이점을 제공합니다.

파이썬의 예외 그룹은 무엇입니까?파이썬의 예외 그룹은 무엇입니까?Apr 30, 2025 pm 02:07 PM

Python 3.11의 예외 그룹은 여러 예외를 동시에 처리하여 동시 시나리오 및 복잡한 작업에서 오류 관리를 향상시킵니다.

파이썬의 기능 주석이란 무엇입니까?파이썬의 기능 주석이란 무엇입니까?Apr 30, 2025 pm 02:06 PM

Python의 기능 주석은 유형 확인, 문서 및 IDE 지원에 대한 기능에 메타 데이터를 추가합니다. 코드 가독성, 유지 보수를 향상 시키며 API 개발, 데이터 과학 및 라이브러리 생성에 중요합니다.

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

DVWA

DVWA

DVWA(Damn Vulnerable Web App)는 매우 취약한 PHP/MySQL 웹 애플리케이션입니다. 주요 목표는 보안 전문가가 법적 환경에서 자신의 기술과 도구를 테스트하고, 웹 개발자가 웹 응용 프로그램 보안 프로세스를 더 잘 이해할 수 있도록 돕고, 교사/학생이 교실 환경 웹 응용 프로그램에서 가르치고 배울 수 있도록 돕는 것입니다. 보안. DVWA의 목표는 다양한 난이도의 간단하고 간단한 인터페이스를 통해 가장 일반적인 웹 취약점 중 일부를 연습하는 것입니다. 이 소프트웨어는

안전한 시험 브라우저

안전한 시험 브라우저

안전한 시험 브라우저는 온라인 시험을 안전하게 치르기 위한 보안 브라우저 환경입니다. 이 소프트웨어는 모든 컴퓨터를 안전한 워크스테이션으로 바꿔줍니다. 이는 모든 유틸리티에 대한 액세스를 제어하고 학생들이 승인되지 않은 리소스를 사용하는 것을 방지합니다.

SublimeText3 Linux 새 버전

SublimeText3 Linux 새 버전

SublimeText3 Linux 최신 버전

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

PhpStorm 맥 버전

PhpStorm 맥 버전

최신(2018.2.1) 전문 PHP 통합 개발 도구