我正在寻找一种更新(有序)字典中的值的快速方法,该字典包含数千万个值,更新后的值存储在列表/数组中。
我正在编写的程序将原始字典(数字元组)中的键列表作为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
答案 0 :(得分:3)
最后一段代码不仅很慢。我不认为它可以满足您的要求:
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