Pythonic способ перебирать атрибуты объекта и назначать новый атрибут

#python #oop

#python #ооп

Вопрос:

Я работаю с большим объектом a на Python. Объект имеет два других повторяющихся объекта 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)
  

Однако я не уверен, что это самый питонический способ сделать это.

Комментарии:

1. Его можно было бы преобразовать в представление списка, что, вероятно, было бы немного быстрее. Я не уверен, как еще это можно улучшить, но я полагаю, что кто-то здесь знал бы, как реализовать itertools или что-то еще, чтобы уменьшить временную сложность этого!

2. Будьте осторожны при сравнении ids , поскольку иногда они будут действовать неожиданным образом, особенно в многопоточных программах…

Ответ №1:

Вы можете улучшить свой код с временной сложности O (n x m) до O (n m) (от квадратичного до линейного), создав dict для каждого списка, который сопоставляет id s объектов в списке с объектами, и используя set пересечение между ключами 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