繁体   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