Как получить доступ к атрибутам всех экземпляров, хранящихся в списке? - PullRequest
0 голосов
/ 30 мая 2018

Intro

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

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

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

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

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

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

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) Есть ли прямой способ найти экземпляр в списке, для которого значениеопределенный атрибут максимален?

Ответы [ 2 ]

0 голосов
/ 01 июня 2018

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

from operator import attrgetter

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

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

0 голосов
/ 30 мая 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)
...