Как получить доступ к атрибутам всех экземпляров, хранящихся в списке?

Введение

Исходя из этого вопроса

Python - создание экземпляров объекта в цикле с независимой обработкой< /а>

Я спрашивал себя, как получить доступ к атрибутам всех, а не только к одному экземпляру, если вы создали список экземпляров.

Минимальный пример

Рассмотрите возможность создания списка экземпляров компании с именем и значением атрибутов. Теперь я хотел бы знать, какая из этих компаний имеет наибольшую стоимость.

Пока я просто сохраняю значения атрибута value в массиве, а затем нахожу индекс максимального значения.

import numpy as np

class Company(object):
    def __init__(self, name, value):
        self.name = name
        self.value = value

companies = []
for name in 'ABC':
    companies.append(Company(name, np.random.rand()))

l = len(companies)
liste = np.zeros(l)
for i in range(l):
    liste[i] = companies[i].value

ind = np.unravel_index(np.argmax(liste), liste.shape)
print("Highest value: ", liste[ind])
print("Company of highest value: ", companies[ind[0]].name)

Вопросы

1) Есть ли другой способ создать этот список всех значений атрибутов без цикла for?

2) Есть ли прямой способ найти экземпляр в списке, для которого значение определенного атрибута максимально?


person Ben    schedule 30.05.2018    source источник


Ответы (2)


Он не избегает полностью for, но заменяет его пониманием списка:

from operator import attrgetter

max_val_company = max((c for c in companies), key=attrgetter('value'))

max_val_company будет содержать Company объект с максимальным value атрибутом.

person Torbik    schedule 01.06.2018

Вместо того, чтобы хранить весь объект в глобальном списке и перебирать их, вы можете сравнить/сохранить значение в глобальной переменной при инициализации объекта.

import numpy as np
maxval = []
maxname = []

class Company(object):
  def __init__(self,name,value):
    self.name=name
    self.value=value
    if len(maxval)>0 and maxval[0] < value :
      maxval[0]=value
    elif len(maxval)==0:
      maxval.append(value)
person Sach    schedule 30.05.2018
comment
Спасибо. Таким образом, я вычислю максимальное значение, но как получить название компании?! - person Ben; 31.05.2018
comment
вы можете сохранить название компании таким же образом, либо имея другую переменную, сохраняя название компании для наибольшего значения, либо сохраняя оба значения в dict как пару значений ключа. - person Sach; 03.06.2018