【发布时间】:2018-04-09 23:35:44
【问题描述】:
我正在寻找解决以下问题的最有效/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 多个条目和更多的数据
【问题讨论】:
-
仅供参考,我已将变量
dict重命名为d。不要在类之后命名变量。 -
当你说高效/python方式时,究竟是什么意思...内存高效?速度?您是否对足够高效有一个门槛?基本上,这个问题的上下文是什么?
-
所有 python 字典都有内置方法,称为 items 和 iteritems 。您还可以使用关键字字典语法来实例化对象,例如Dummy(**myArgsDictionnary) (您需要在 init 参数中添加相应的属性)
-
@Yftach 我的解决方案似乎超载(对我而言),包含提取的列表、生成器和排序列表。我对python有点陌生,所以也许有一种更优雅的方法。目前最大的担忧是速度。
-
这段代码真的只需要一小部分时间吗?例如,从服务器下载对象?您似乎正在尝试对可能不在瓶颈附近的代码进行微优化。
标签: python dictionary optimization lambda