Pythonic способ циклически перебирать атрибуты объекта и назначать новый атрибут - PullRequest
2 голосов
/ 16 апреля 2019

Я работаю с большим объектом 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 Ответ

4 голосов
/ 16 апреля 2019

Вы можете улучшить свой код с временной сложностью O (nxm) до O (n + m) (от квадратичного к линейному), создавая dict для каждого списка, который отображаетсяid s объектов в списке к объектам и использование набора пересечений между клавишами dict, чтобы найти общие id s между двумя списками.Кроме того, вам не нужно использовать функцию 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...