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

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

王林
풀어 주다: 2023-05-12 18:58:17
앞으로
2428명이 탐색했습니다.

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:yisu.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿