遍历对象属性并分配新属性的Python方式

时间:2019-04-16 19:48:30

标签: python oop

我正在使用Python中的大对象a。该对象还有两个其他可迭代对象bc作为属性onetwo传递给它。

我想先将对象中的重要数据合并,然后再将其传递给模板引擎。我正在尝试从one中获取一个属性,并将其分配给two

我的第一个想法是使用两个堆叠的for循环来解析两个对象。

for c in a.two:
    for a in a.one:
        if a.id == c.id:
            setattr(c, 'title', a.title)

但是,我不确定这是否是最Python化的方法。

1 个答案:

答案 0 :(得分:4)

通过为每个列表构建一个dict,可以将代码的时间复杂度从 O(nxm)改进为 O(n + m)(从二次到线性)将该列表中的对象id映射到该对象,并使用dict键之间的设置交集来查找两个列表之间的公用id。另外,如果您要设置的属性名称是固定的,则无需使用setattr函数。您可以直接将其分配给对象的属性:

one = {obj.id: obj for obj in a.one}
two = {obj.id: obj for obj in a.two}
for id in set(one).intersection(two):
    two[id].title = one[id].title