[英]How to update a large dictionary using a list quickly?
我正在尋找一種更新(有序)字典中的值的快速方法,該字典包含數千萬個值,更新后的值存儲在列表/數組中。
我正在編寫的程序將原始字典(數字元組)中的鍵列表作為numpy數組,並將它們傳遞給一個函數,該函數返回一個新數字數組(每個鍵值一個)。 然后將此數組與相應的字典值相乘(通過分段數組乘法),而這就是我們希望用來更新字典的值的返回的一維數組。 新數組中的條目按相應鍵的順序存儲,因此我可以使用循環遍歷字典並逐個更新值。 但這太低效了。 有沒有更快速的方法來更新此不使用循環的字典中的值?
一個類似問題的示例是,如果字典中的鍵表示空間中點的x和y坐標,並且值表示在該點處施加的力。 如果要計算從原點到每個點的扭矩,則首先需要一個類似以下的函數:
def euclid(xy):
return (xy[0]**2 + xy[1]**2)**0.5
如果xy
代表x,y元組,則它將返回距原點的歐幾里得距離。 然后,我們可以將其乘以相應的字典值以返回扭矩,如下所示:
for xy in dict.keys():
dict[xy] = euclid(xy)*dict[xy]
但是此循環很慢,我們可以利用數組代數在一個操作中獲取新值:
new_dict_values = euclid(np.array(dict.keys()))*np.array(dict.values())
我們希望在這里找到一種快速的方法來更新字典,而不是利用:
i = 0
for key in dict.keys():
dict[key] = new_dict_value[i]
i += 1
最后一段代碼不僅很慢。 我不認為它可以做您想要做的事情:
for key in dict.keys():
for i in range(len(new_dict_values)):
dict[key] = new_dict_value[i]
對於字典中的每個鍵,您將遍歷new_dict_values的整個列表,並將每個鍵分配給該鍵的值,從而覆蓋您在循環的上一次迭代中分配的值。 這將為您提供一個字典,其中每個鍵都具有new_dict_value中最后一個元素的值,我認為這不是您想要的。
如果確定字典中鍵的順序與new_dict_values中值的順序相同,則可以執行以下操作:
for key, value in zip(dict.keys(), new_dict_values):
dict[key] = value
編輯:另外,將來在python中無需遍歷一系列數字和通過索引訪問列表的元素。 這個:
for i in range(len(new_dict_values)):
dict[key] = new_dict_value[i]
等效於此:
for i in new_dict_values:
dict[key] = i
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.