gpt4 book ai didi

python - 在Python中将字典分配给对象的有效方法

转载 作者:行者123 更新时间:2023-12-01 09:33:38 25 4
gpt4 key购买 nike

我正在寻找解决以下问题的最有效/python 方法:

我有一个本地对象列表 (list_a)、一个服务器上的对象列表 (list_b)。 list_b 是字典列表,而不是对象。我想用服务器给出的信息更新本地对象中的一些信息。可以通过字典中的属性name或标识符'name'来完成分配。两个列表可以是彼此的子集。

这是我当前的解决方案以及一些示例数据:

class Dummy():
def __init__(self, name):
self._name = name
self._attr = ''

def __str__(self):
return "Test-Object[" + self._name + ", " + self._attr + "]"

def update(self, obj):
self._attr = obj['attr']

__repr__ = __str__

list_a = [Dummy(str(x)) for x in xrange(10)]
list_b = [{'name': str(x), 'attr': str(x*2)} for x in xrange(8, -1, -1)]

extracted_names_a = [x._name for x in list_a]
extracted_names_b = [x['name'] for x in list_b]
filtered_list_a = (x for x in list_a if x._name in extracted_names_b)
filtered_list_b = (x for x in list_b if x['name'] in extracted_names_a)
sorted_list_a = sorted(filtered_list_a, key=lambda k: k._name)
sorted_list_b = sorted(filtered_list_b, key=lambda k: k['name'])
for obj, d in zip(sorted_list_a, sorted_list_b):
obj.update(d)

print(list_a)

这只是一个简单的例子,现实世界中有 2000 多个条目和更多的数据

最佳答案

你最大的问题是过滤。对于每个列表的每个元素,您都在搜索整个其他列表以查看它是否存在。这需要二次时间。如果将这些对象转换为名称集或按名称键入的字典,则可以消除二次工作并使其成为对数线性。

之后,排序也不再需要,这是代码是对数线性的唯一原因,所以现在它将是线性的。

当我们这样做时,您正在浪费内存,甚至可能还浪费时间,建立一个列表只是为了在下一行的生成器表达式中迭代它。如果我们去掉sorted,这一点就变得更加重要,因为这样我们就不再需要列表了。

所以:

dict_a = {x._name: x for x in list_a}
for d in list_b:
try:
dict_a[d['name']].update(d)
except KeyError:
pass

使用 try/except 进行字典查找负责过滤掉没有匹配对象的字典,并且您不需要过滤掉没有匹配字典的对象,因为它们不会被调用。

如果字典比对象多得多,则反转事物以创建字典的字典并迭代对象。

或者,如果您可以首先将对象保存在字典中,而不是将它们保存在列表中并仅为此代码创建临时字典,那就更好了。如果您可以在解析服务器响应时逐一迭代这些字典,而不是首先构建它们的列表,那么您将消除所有不必要的大型分配,并可能进一步加快速度。

关于python - 在Python中将字典分配给对象的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49735841/

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