Как получить объект, который имеет минимальное значение в orderDict? - PullRequest
0 голосов
/ 04 сентября 2018

У меня есть заказанный объект,

 [<f.Packet object at 0x07AD7090>, <f.Packet object at 0x07ACA8F0>, <f.Packet object at 0x07ACAC90>, <f.Packet object at 0x07A5F5D0>, <f.Packet object at 0x07ACA410>, <f.Packet object at 0x07ABBF50>, <f.Packet object at 0x07ACA830>]

Каждый из этих объектов имеет такие атрибуты, как имя, возраст и источник. Как я могу получить объект, возраст которого минимальный?

Ответы [ 2 ]

0 голосов
/ 04 сентября 2018

В зависимости от того, что вам нужно, вы можете использовать простой обход:

min(orderedDict.values(), key=lambda x: x.age)

Но если вам нужен O (1) способ сделать это, вам нужно создать свой собственный класс, потому что OrderedDict упорядочивает элементы только на основе порядка вставки. Например, вы можете использовать SortedDict из Sorted Containers (или написать свой) и сделать что-то подобное (при условии, что вы все еще хотите иметь возможность получать элементы на основе порядка вставки):

from collections import OrderedDict
from sortedcontainers import SortedDict

class MyOrderedDict(OrderedDict):
     def __init__(self):
             super(MyOrderedDict, self).__init__(self)
             self.sorted = SortedDict()
     def __setitem__(self, key, value):
             super(MyOrderedDict, self).__setitem__(key, value)
             self.sorted[value.age] = value
     def __delitem__(self, key):
             age = super(MyOrderedDict, self).__getitem__(key).age
             super(MyOrderedDict, self).__delitem__(key)
             self.sorted.__delitem__(age)
     def ageIterator(self):
         for age in self.sorted:
             yield (age, self.sorted[age])

orderedDict = MyOrderedDict()
#...

for item in orderedDict:
    # Items in the order of insertions

for age, item in orderedDict.ageIterator():
    # Items by age
0 голосов
/ 04 сентября 2018

попробуйте это один раз, предположим, вы d как заказанный Dict

import operator
#...
person=sorted(d.values(), key=operator.attrgetter('age'))[0]
print person.age
...