#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