簡體   English   中英

如何使用列表快速更新大型詞典?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM