仅在循环中第一次修改可能的重复元素

时间:2019-02-22 10:15:15

标签: python python-3.x

我有2张桌子。一个所有者可以没有任何物品,也可以有多个物品。

Item

id  name    owner_id (fk) 
1   alpha   1
2   beta    1


Owner

id   name     attrc 
1   owner1    complex_attr1
2   owner2    complex_attr2 

我从数据库中分别作为列表检索它们:

    for item in item_list:
        for owner in owner_list:
            if item.owner_id == owner.id:
              # I modify owner attributes    
              owner.attrc = modify_funct(attrc)
              item.owner = owner 

我用HTML列出了Items,并为每个Item显示了OwnerItem的一些属性。在循环中,我将Owner设为Item对象的属性;事情是显示在html中,我需要修改一些Owner原始db属性

因此在html模板创建中,我将得到类似的东西:

for item in item_list:
 <div>
   item.name
   <span> item.owner.name<span>
   <span> item.owner.attrc<span>
</div>

由于Owner with id 1同时拥有Item with id 1 and 2,因此在循环的第一个迭代中,attrc被修改,在循环的第二个迭代中'attrc'已经被修改,并且函数没有找到预期的结果。

解决方案是使用另一个循环在外部循环/更改“ attrc”,然后循环item_list和owner_list,以减少循环?

2 个答案:

答案 0 :(得分:1)

这不是最有效的解决方案,但是与您现有的代码最相似:

for owner in owner_list:
    if any(item.owner_id == owner.id for item in item_list):
        owner.attrc = modify_funct(attrc)

答案 1 :(得分:0)

使用设定的理解力更有效的解决方案:

owner_ids = {item.owner_id for item in item_list}
for owner in owner_list:
    if owner.id in owner_ids:
        owner.attrc = modify_funct(attrc)