您好,登錄后才能下訂單哦!
這篇文章主要講解了“Python中TypeError:unhashable type:'dict'錯誤如何解決”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Python中TypeError:unhashable type:'dict'錯誤如何解決”吧!
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 字符串。
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
。
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 中的大多數不可變內置對象都是可散列的,而可變對象是不可散列的。
如果一個對象是可散列的,那么它可以用作字典中的鍵和集合中的元素,因為這些數據結構在內部使用散列值。
可哈希對象包括 - str 、int 、bool 、tuple 、frozenset。
不可散列的對象包括 - list 、dict 、set。
請注意
,元組和凍結集僅在其元素可哈希時才可哈希。
我們可以通過將對象傳遞給內置的 hash()
函數來檢查對象是否可散列。
print(hash('jiyik.com')) # ????? 4905958875846995527 # ?? TypeError: unhashable type: 'dict' print(hash({'name': 'Jiyik'}))
散列函數返回傳入對象的散列值(如果有的話)。
哈希值是整數,用于在字典查找期間比較字典鍵。
!> 可散列對象的散列值在其生命周期內永遠不會改變。 這就是為什么大多數不可變對象是可哈希的,而可變對象是不可哈希的。
像字典這樣的對象是可變的,因為字典的內容可以改變。
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 'dict'> print(isinstance(my_dict, dict)) # ????? True my_str = 'jiyik.com' print(type(my_str)) # ????? <class 'str'> print(isinstance(my_str, str)) # ????? True
type
函數返回對象的類型。
如果傳入的對象是傳入類的實例或子類,則 isinstance
函數返回 True。
感謝各位的閱讀,以上就是“Python中TypeError:unhashable type:'dict'錯誤如何解決”的內容了,經過本文的學習后,相信大家對Python中TypeError:unhashable type:'dict'錯誤如何解決這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。