作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在用 Python 处理一个大对象 a
。该对象还有另外两个可迭代对象 b
和 c
作为属性 one
和 two
传递给它。
我想在将对象传递给模板引擎之前合并对象中的重要数据。我正在尝试从 one
中获取一个属性并将其分配给 two
。
我的第一个想法是像这样用两个堆叠的 for
循环来解析这两个对象..
for c in a.two:
for a in a.one:
if a.id == c.id:
setattr(c, 'title', a.title)
但是,我不确定这是否是最符合 Python 风格的方式。
最佳答案
您可以通过为每个列表构建字典来将代码的时间复杂度从 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/
我是一名优秀的程序员,十分优秀!