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

2024-05-26 11:11:14 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我正在编写的程序将原始字典中的键列表(即数字元组)作为numpy数组,并将它们传递给一个函数,该函数返回一个新数字数组(每个键值对应一个)。然后将这个数组与相应的字典值相乘(通过逐段数组相乘),我们希望使用这个返回的1-D值数组来更新字典。新数组中的条目按相应键的顺序存储,因此我可以使用循环遍历字典并逐个更新值。但这效率太低了。有没有更快的方法来更新这个不使用循环的字典中的值?你知道吗

类似问题的一个例子是,如果字典中的键表示空间中点的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

Tags: 方法函数in利用列表newfor字典
1条回答
网友
1楼 · 发布于 2024-05-26 11:11:14

最后一段代码不仅仅是慢。我不认为它做了你想要它做的:

for key in dict.keys():
    for i in range(len(new_dict_values)):
        dict[key] = new_dict_value[i]

对于字典中的每个键,您将遍历新的dict值的整个列表,并将每个值指定给该键的值,覆盖在循环的上一次迭代中指定的值。这将为您提供一个字典,其中每个键都有new\u dict\u value中最后一个元素的值,我认为这不是您想要的。你知道吗

如果确定字典中键的顺序与新dict值中值的顺序相同,则可以执行以下操作:

for key, value in zip(dict.keys(), new_dict_values):
    dict[key] = value

Edit:而且,在将来python中不需要遍历一系列数字,也不需要通过索引访问列表的元素。这是:

for i in range(len(new_dict_values)):
        dict[key] = new_dict_value[i]

相当于:

for i in new_dict_values:
        dict[key] = i

相关问题 更多 >