gpt4 book ai didi

python - 如何使用列表快速更新大型词典?

转载 作者:太空宇宙 更新时间:2023-11-03 23:58:17 27 4
gpt4 key购买 nike

我正在寻找一种快速更新(有序)字典中的值的方法,该字典包含数千万个值,其中更新的值存储在列表/数组中。

我正在编写的程序将原始字典中的键列表(数字元组)作为一个 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

关于python - 如何使用列表快速更新大型词典?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56738819/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com