从两个对象列表中获取具有相同id的对象列表

时间:2017-07-16 18:42:57

标签: python list object

有人能告诉我从两个不同的对象列表中获取具有相同实例属性的对象列表的有效方法吗id吗?

我正在做这样的事情:

[_update_obj_properties(orig_obj, new_obj, columns) 
    for new_obj in new_objs for orig_obj in orig_objs 
        if orig_obj.id == new_obj.id]

但我觉得这不是很有效率。

2 个答案:

答案 0 :(得分:2)

如果每个列表中的ID都是唯一的,您可以这样做:

def to_dict(lst):
  return {obj.id : obj for obj in lst}

def unify_dicts(d1, d2):
  return [(obj1, d2[id]) for id, obj in d1.items() if id in d2]

objects_to_update = unify_dicts(to_dict(new_objs), 
                                to_dict(orig_objs))
for new_obj, orig_obj in objects_to_update:
    update_obj_properties(orig_obj, new_obj, columns)

答案 1 :(得分:0)

如果你想为每个对象只调用一次_update_obj_properties,你必须在第一次发现条件为True后摆脱循环。这不能在列表推导中完成,所以这是一个正常的循环:

my_list = []
for new_obj in new_objs:
    for orig_obj in orig_objs: 
        if orig_obj.id == new_obj.id:
            my_list.append(_update_obj_properties(orig_obj, new_obj, columns))
            break

你实际上想要为每对匹配的对象调用_update_obj_properties(因此对于任何给定的对象可能多次调用),你的列表理解解决方案就可以了。