我有一個由 pandas 生成的字典,它有numpy.int64物件而不是 nativeint作為鍵。我需要將這些更改為本機型別,并且對為什么以下代碼不那么成功感到困惑:
d = {np.int64(0): None}
for k, v in d.items():
print(str(type(k))) # <class 'numpy.int64'>
k_nat = k.item()
print(str(type(k_nat))) # <class 'int'>
print(d) # {0: None}
d.update({k_nat:1})
print(d) # {0: 1}
# Therefore update using int was successful
for k, v in d.items():
print(str(type(k))) # <class 'numpy.int64'>
誰能解釋這里發生了什么?從我的角度來看,這段代碼自相矛盾,因為使用原語的更新k_nat是成功的,但最終關鍵仍然是numpy.int64.
uj5u.com熱心網友回復:
不,這不是錯誤。
此代碼顯示更新期間密鑰未更改:
import numpy as np
d = {np.int64(0): None}
for k, v in d.items():
print(str(type(k))) # <class 'numpy.int64'>
k_nat = k.item()
print(str(type(k_nat))) # <class 'int'>
print(d) # {0: None}
d.update({k_nat:1})
print(d) # {0: 1}
# Therefore update using int was successful
# But key does not change
print(type(list(d.keys())[0])) # → <class 'numpy.int64'>
for k, v in d.items():
print(str(type(k))) # <class 'numpy.int64'>
Python 處理int(0)和np.int64(0)wrt dict-access。但是原始鍵沒有改變(只有值)。請注意,int(0)和np.int64(0)都表示為0運算式,如print(d). 因此,它們看起來是否相同。但是,它們相等但不相同。
特別是我們有這種行為
print(d[np.int64(0)] == d[int(0)]) # True
print(np.int64(0) == int(0)) # True
print(np.int64(0) is int(0)) # False
如果要轉換密鑰型別,可以使用:
new_d = {int(k): v for k, v in d.items()}
print(type(list(new_d.keys())[0])) # <class 'int'>
對于某些類,確實可以在不更改物件的情況下更改物件的型別,id因此它仍然可以作為相同的 dict-key 作業:
class A(object):
pass
class B(object):
pass
d = {A(): None}
print(type(list(d.keys())[0])) # <class '__main__.A'>
# change type of object but not the object itself
list(d.keys())[0].__class__ = B
print(type(list(d.keys())[0])) # <class '__main__.B'>
但是,對于其他一些類(包括np.int64),這是不可能的:
x = np.int64(0)
try:
x.__class__ = int
except TypeError as err:
print(err) # __class__ assignment only supported for heap types or ModuleType subclasses
uj5u.com熱心網友回復:
兩者0和np.int64(0)散列到相同的值:
print(hash(0))
print(np.int64(0))
輸出:
0
0
因此,您的字典實際上并沒有替換鍵資料型別,您可以使用簡單的 dict 理解來實作您想要的行為(在任何情況下,在回圈遍歷時修改可迭代物件可能是個壞主意)
import numpy as np
d = {np.int64(0): None}
for k, v in d.items():
print(str(type(k))) # <class 'numpy.int64'>
d = {int(k):v for k,v in d.items()}
print(d)
for k, v in d.items():
print(str(type(k)))
但是,根據您實際獲取字典的方式,您最好簡單地更改 pandas 系列/資料框的 dtype
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/441367.html
上一篇:使用串列遍歷字典
下一篇:如何創建要列出的字串映射
