Pythonic 方式循环对象属性并分配新属性

标签 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)

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

最佳答案

通过为每个列表构建一个字典,您可以将代码的时间复杂度从 O(n x m) 提高到 O(n + m)(二次到线性)它将列表中对象的 id 映射到对象,并使用字典键之间的集合交集来查找两个列表之间的公共(public) 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

关于Pythonic 方式循环对象属性并分配新属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55715628/

相关文章:

python - 使用 python 发送邮件 - 如何设置与 'From' 地址不同的返回路径

java - 将指针位置传递给 Java 中的对象

java - 如果 ArrayList 对象的字段之一包含重复条目,如何修改该对象?

php - 如何使用 PHP 显示文件系统中的图像

python - 具有已知有序边界点的弱简单多边形的高效三角剖分

python - 根据 Python 中单独列表中键的顺序,按键对字典列表进行排序

python - 使用 Python 从 Twitch 抓取屏幕截图

python - 忽略少于三个词的项目

c++ - 关于基类和派生类的构造函数调用

javascript - 面向对象,javascript中的继承无法调用外部方法