Python中TypeError:unhashable type:'dict'錯誤如何解決

王林
發布: 2023-05-12 18:58:17
轉載
2192 人瀏覽過

Python “TypeError: unhashable type: ‘dict’ ” 發生在我們將字典用作另一個字典中的鍵或用作集合中的元素時。

要解決該錯誤,需要改用 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 中的大多數不可變內建物件都是可散列的,而可變物件是不可散列的。

如果一個物件是可散列的,那麼它可以用作字典中的鍵和集合中的元素,因為這些資料結構在內部使用雜湊值。

可雜湊物件包括- strintbooltuple frozenset

不可散列的物件包括 - 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 函數傳回物件的型別。

如果傳入的物件是傳入類別的實例或子類,則 isinstance 函數傳回 True。

以上是Python中TypeError:unhashable type:'dict'錯誤如何解決的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:yisu.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!