Python中TypeError:unhashable?type:'dict'錯(cuò)誤的解決辦法
Python “TypeError: unhashable type: ‘dict’ ” 發(fā)生在我們將字典用作另一個(gè)字典中的鍵或用作集合中的元素時(shí)。
要解決該錯(cuò)誤,需要改用 frozenset
,或者在將字典用作鍵之前將其轉(zhuǎn)換為 JSON 字符串。
當(dāng)我們將字典用作另一個(gè)字典中的鍵時(shí),會(huì)發(fā)生錯(cuò)誤。
# ??? using dictionary as a key in a dictionary # ?? TypeError: unhashable type: 'dict' my_dict = {'name': 'Jiyik', {'country': 'China'}: 'address'}
或者當(dāng)我們使用字典作為 set
對(duì)象中的元素時(shí)。
# ??? 使用字典作為集合中的元素 # ?? TypeError: unhashable type: 'dict' my_set = {{'name': 'Jiyik'}}
我們不能將字典用作字典中的鍵或集合中的元素,因?yàn)樽值鋵?duì)象是可變的和不可散列的。
將字典轉(zhuǎn)為JSON字符串解決報(bào)錯(cuò)
解決該錯(cuò)誤的一種方法是在將字典用作鍵之前將其轉(zhuǎn)換為 JSON 字符串。
import json # ??? 將字典轉(zhuǎn)換為 JSON 字符串 my_json = json.dumps({'country': 'China'}) my_dict = {'name': 'Jiyik', my_json: 'address'} print(my_dict) # ??? {'name': 'Jiyik', '{"country": "China"}': 'address'} # ??? 當(dāng)你必須訪問字典中的鍵時(shí) print(my_dict[json.dumps({'country': 'Austria'})]) # ??? address
json.dumps
方法將 Python 對(duì)象轉(zhuǎn)換為 JSON 格式的字符串。 這是有效的,因?yàn)樽址遣豢勺兊暮涂缮⒘械摹?/p>
相反,json.loads
方法將 JSON 字符串解析為本機(jī) Python 對(duì)象,例如 my_dict = json.loads(my_json_str)
。
使用 frozenset 解決錯(cuò)誤
解決錯(cuò)誤的另一種方法是使用 frozenset
。
my_key = {'country': 'China'} key = frozenset(my_key.items()) print(key) # ??? frozenset({('country', 'China')}) my_dict = {'name': 'Jiyik', key: 'address'} # ??? 當(dāng)我們必須訪問 key 時(shí) print(my_dict[frozenset(my_key.items())]) # ??? 'address'
dict.items
方法返回字典項(xiàng)((鍵,值)對(duì))的新視圖。
# ??? dict_items([('name', 'jiyik'), ('age', 30)]) print({'name': 'jiyik', 'age': 30}.items())
我們使用字典的項(xiàng)目創(chuàng)建了一個(gè) frozenset
,我們可以將其用作字典中的鍵(以及另一個(gè)集合中的元素)。
frozenset
是 Python 集合對(duì)象的不可變版本,因此它可以用作字典中的鍵或另一個(gè)集合中的元素。
請(qǐng)注意 ,我們必須使用相同的方法來訪問字典中的鍵。
我們可以將調(diào)用 frozenset(my_key.items())
的結(jié)果存儲(chǔ)在變量中,并在設(shè)置或訪問字典中的鍵時(shí)重用 frozenset。
將字典轉(zhuǎn)換為元組以解決錯(cuò)誤
解決錯(cuò)誤的另一種方法是將字典轉(zhuǎn)換為元組。
dict_key = {'id': 1, 'country': 'China'} # ? 轉(zhuǎn)換為元組 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'} # ??? 當(dāng)你必須訪問字典中的鍵時(shí) print(my_dict[my_tuple]) # ??? address
將字典轉(zhuǎn)換為元組時(shí),元組僅包含字典的鍵。
元組是不可變的,因此包含字典鍵的元組可以安全地用作另一個(gè)字典中的鍵。
使用一個(gè)字典作為另一個(gè)字典中的值
我們不能將一個(gè)字典用作另一個(gè)字典中的鍵,但可以將一個(gè)字典用作值。
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'}
我們將一個(gè)字典設(shè)置為另一個(gè)字典中的值。
這是允許的,因?yàn)橄拗撇贿m用于字典值。
將一個(gè)字典的所有鍵值對(duì)添加到另一個(gè)字典
如果需要將一個(gè)字典的所有鍵值對(duì)添加到另一個(gè)字典,則可以使用 for 循環(huán)。
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
方法返回字典項(xiàng)((鍵,值)對(duì))的新視圖。
my_dict = {'id': 1, 'name': 'Jiyik'} # ??? dict_items([('id', 1), ('name', 'Jiyik')]) print(my_dict.items())
在每次迭代中,我們將鍵值對(duì)設(shè)置為另一個(gè)字典。
Python 中的可散列對(duì)象與不可散列對(duì)象
Python 中的大多數(shù)不可變內(nèi)置對(duì)象都是可散列的,而可變對(duì)象是不可散列的。
如果一個(gè)對(duì)象是可散列的,那么它可以用作字典中的鍵和集合中的元素,因?yàn)檫@些數(shù)據(jù)結(jié)構(gòu)在內(nèi)部使用散列值。
可哈希對(duì)象包括 - str 、int 、bool 、tuple 、frozenset。
不可散列的對(duì)象包括 - list 、dict 、set。
請(qǐng)注意
,元組和凍結(jié)集僅在其元素可哈希時(shí)才可哈希。
檢查一個(gè)對(duì)象是否可散列
我們可以通過將對(duì)象傳遞給內(nèi)置的 hash()
函數(shù)來檢查對(duì)象是否可散列。
print(hash('jiyik.com')) # ??? 4905958875846995527 # ?? TypeError: unhashable type: 'dict' print(hash({'name': 'Jiyik'}))
散列函數(shù)返回傳入對(duì)象的散列值(如果有的話)。
哈希值是整數(shù),用于在字典查找期間比較字典鍵。
!> 可散列對(duì)象的散列值在其生命周期內(nèi)永遠(yuǎn)不會(huì)改變。 這就是為什么大多數(shù)不可變對(duì)象是可哈希的,而可變對(duì)象是不可哈希的。
像字典這樣的對(duì)象是可變的,因?yàn)樽值涞膬?nèi)容可以改變。
my_dict = {'name': 'Fql'} my_dict['name'] = 'Jiyik' print(my_dict) # ??? {'name': 'Jiyik'}
另一方面,包含原始值的 fronzenset
和元組對(duì)象是不可變的(和可散列的)。
字典由鍵索引,字典中的鍵可以是任何不可變類型,例如 字符串或數(shù)字。
如果元組包含字符串、數(shù)字或元組,則它們只能用作字典中的鍵。
如果 fronzenset
或元組包含可變對(duì)象(例如列表),則不能將其用作字典中的鍵或集合中的元素。
如果我們不確定變量存儲(chǔ)的對(duì)象類型,請(qǐng)使用 type()
函數(shù)。
my_dict = {'name': 'Jiyik'} print(type(my_dict)) # ??? <class 'dict'> print(isinstance(my_dict, dict)) # ??? True my_str = 'jiyik.com' print(type(my_str)) # ??? <class 'str'> print(isinstance(my_str, str)) # ??? True
type
函數(shù)返回對(duì)象的類型。
如果傳入的對(duì)象是傳入類的實(shí)例或子類,則 isinstance
函數(shù)返回 True。
總結(jié)
Python “TypeError: unhashable type: ‘dict’ ” 發(fā)生在我們將字典用作另一個(gè)字典中的鍵或用作集合中的元素時(shí)。
要解決該錯(cuò)誤,請(qǐng)改用 frozenset
,或者在將字典用作鍵之前將其轉(zhuǎn)換為 JSON 字符串。
到此這篇關(guān)于Python中TypeError:unhashable type:'dict'錯(cuò)誤的文章就介紹到這了,更多相關(guān)Python TypeError:unhashable type:dict內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Python中報(bào)錯(cuò) “TypeError: ‘list‘ object is not callable”問題及解決
- Python?TypeError:?‘float‘?object?is?not?subscriptable錯(cuò)誤解決
- Python開發(fā)時(shí)報(bào)TypeError:?‘int‘?object?is?not?iterable錯(cuò)誤的解決方式
- python報(bào)錯(cuò)TypeError: Input z must be 2D, not 3D的解決方法
- 解決python錯(cuò)誤提示:TypeError: expected string or bytes-lik問題
相關(guān)文章
tensorflow2.0如何實(shí)現(xiàn)cnn的圖像識(shí)別
這篇文章主要介紹了tensorflow2.0如何實(shí)現(xiàn)cnn的圖像識(shí)別,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12Python使用urlretrieve實(shí)現(xiàn)直接遠(yuǎn)程下載圖片的示例代碼
這篇文章主要介紹了Python使用urlretrieve實(shí)現(xiàn)直接遠(yuǎn)程下載圖片的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08Python 實(shí)現(xiàn)購物商城,含有用戶入口和商家入口的示例
下面小編就為大家?guī)硪黄狿ython 實(shí)現(xiàn)購物商城,含有用戶入口和商家入口的示例。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-09-09Python3實(shí)現(xiàn)個(gè)位數(shù)字和十位數(shù)字對(duì)調(diào), 其乘積不變
這篇文章主要介紹了Python3實(shí)現(xiàn)個(gè)位數(shù)字和十位數(shù)字對(duì)調(diào), 其乘積不變,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-05-05Python史上最全種類數(shù)據(jù)庫操作方法分享
本文將詳細(xì)探討如何在Python中連接全種類數(shù)據(jù)庫以及實(shí)現(xiàn)相應(yīng)的CRUD(創(chuàng)建,讀取,更新,刪除)操作,文中的示例代碼講解詳細(xì),需要的可以參考一下2023-07-07Python可視化學(xué)習(xí)之matplotlib內(nèi)置單顏色
這篇文章主要為大家介紹了Python matplotlib中支持的顏色格式及內(nèi)置的單顏色色號(hào)的匯總,文中的示例代碼講解詳細(xì),需要的可以參考一下2022-02-02如何用Python 實(shí)現(xiàn)全連接神經(jīng)網(wǎng)絡(luò)(Multi-layer Perceptron)
這篇文章主要介紹了如何用Python 實(shí)現(xiàn)全連接神經(jīng)網(wǎng)絡(luò)(Multi-layer Perceptron),幫助大家更好的進(jìn)行機(jī)器學(xué)習(xí),感興趣的朋友可以了解下2020-10-10