итерировать список объектов на основе свойства - PullRequest
0 голосов
/ 20 января 2020

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

Мой класс определен следующим образом:

import time

class Destination(object):
    def __init__(self, name):
        self.name = name
        self.__idleness = time.time()
        # keeps track of the time value when object was created

    def get_idleness(self):
        now = time.time()
        return now - self.__idleness

Что я хочу сделать, это перебрать список Destination объектов на основе возвращаемого значения get_idleness(), либо с для l oop или с любой функцией, которая использует итеративный объект, например numpy.mean() или встроенные max() и min().
Я попытался добавить __iter__() как:

    def __iter__(self):
        yield self.get_idleness()

но когда я попробовал этот пример, вывод был неверным:

dests = []
for i in range(6):
    dests.append(Destination(name="wp%s" % i))

time.sleep(1)

print max(dests)

for d in dests:
    print "%s: %s" % (d.name, d.get_idleness())

# max(dests): wp1
# printing all the values shows that wp0 should be the correct return value

РЕДАКТИРОВАТЬ : я понимаю, что мой вопрос был неясен. Моей конечной целью было бы использовать значение, возвращаемое self.get_idleness() при итерации по списку Destination s. Таким образом, независимо от метода итерации, я сравнивал бы пункты назначения на основе большего значения простоя.

Ответы [ 2 ]

0 голосов
/ 20 января 2020

Если вам нужен объект min или max на основе его get_idleness, вы можете сделать это, указав функцию key:

max(dests, key=Destination.get_idleness)
0 голосов
/ 20 января 2020

Я думаю, вы немного смущены. Если у вас есть список из Destination объектов и вы хотите получить, скажем, максимальное число бездействий среди них, вы можете использовать:

dests = [] # Your list of Destination objects
for i in range(6):
    dests.append(Destination(name="wp%s" % i))

maxIdleness = max( [d.get_idleness() for d in dests] )

Вы хотите max (или min, mean или что-то еще) из списка пунктов назначения, поэтому вы создаете новый список. Вы также можете заранее создать список и использовать его для нескольких вычислений, которые будут более эффективными:

idlenessList = [d.get_idleness() for d in dests]
maxIdleness = max(idlenessList)
minIdleness = min(idlenessList)

Если вы все еще заинтересованы в том, чтобы класс возвращал пользовательское значение min или max, Вам может помочь следующий вопрос: Есть ли способ вернуть пользовательское значение для min и max в Python?


Также обратите внимание, что в вашем коде есть ошибка, Вы не должны использовать скобки при доступе к __idleness, так как это атрибут, а не функция:

    def get_idleness(self):
        now = time.time()
        return now - self.__idleness # not self.__idleness()
...