使 class 具有可比性,以便我可以获得列表中 class 个实例的最大参数值 (Python)
Make a class comparable so that I can get the max paremeter value of class instances within a list (Python)
我有一个定义单个元素 (Request
) 的 class 和由 Request
个实例组成的另一个 class (RequestsBook
)。 RequestsBook
也有将更多请求附加到书中的方法。
class Request:
def __init__(self, req_id, req_type, value):
self.req_id = req_id
self.req_type= req_type
self.value = value
class RequestsBook:
def __init__(self):
self.requests_book = list()
def add(self, new_req):
self.requests_book.append(new_req)
def get_max_value_of_type(self, req_type):
# pass
如上所示,我想了解如何有效地获取 RequestsBook
列表中与特定匹配的 Request
个实例中的最大值 value
输入.
例如:
rb = RequestsBook()
rb.add(Request(1, 'A', 100))
rb.add(Request(2, 'B', 42))
rb.add(Request(3, 'A', 78))
rb.add(Request(4, 'A', 12))
rb.get_max_value_of_type('A') # should return 190
rb.get_max_value_of_type('B') # should return 42
根据我的理解,我需要使用 functools.total_ordering 装饰器使 Request
class 具有可比性。
我以前从未使用过这个装饰器,我正在努力想出一种有效的方法来实现 get_max_value_of_type
。遗憾的是,这个用例的在线示例并不多。任何帮助将不胜感激。
此代码按类型排序,然后按值排序,然后检索最大值作为最后一项。它使用 sorted
内置的键函数,attrgetter
来自 operator
模块。它遵循 Python 文档 (3.10) 中的 Sorting HOWTO tutorial 中的解释。
from operator import attrgetter
class Request:
def __init__(self,request=(None,None,None)):
self.num, self.type, self.value = request
def __repr__(self):
return repr((self.num,self.type,self.value))
class RequestsBook(Request):
def __init__(rb):
Request.__init__(rb)
rb.bklist = []
rb.typetp = ('A','B','C')
def sortattr(rb,l,a):
return sorted(l,key=attrgetter(a))
def maxtype(rb):
typel = rb.sortattr(rb.bklist,'type')
maxl = []
for t in rb.typetp:
tl = [req for req in typel if req.type == t]
mtl = rb.sortattr(tl,'value')
maxl.append(mtl[-1])
return maxl
inputl = [(1,'A',100),(2,'B',40),(3,'C',30),(4,'A',40),(5,'A',10),(6,'A',80),(7,'C',30),(8,'C',10),(9,'B',70),(10,'B',90)]
bk = RequestsBook()
bk.bklist = [Request(i) for i in inputl]
maxtypel = bk.maxtype()
print('input: ',inputl)
print('output: ',maxtypel)
我有一个定义单个元素 (Request
) 的 class 和由 Request
个实例组成的另一个 class (RequestsBook
)。 RequestsBook
也有将更多请求附加到书中的方法。
class Request:
def __init__(self, req_id, req_type, value):
self.req_id = req_id
self.req_type= req_type
self.value = value
class RequestsBook:
def __init__(self):
self.requests_book = list()
def add(self, new_req):
self.requests_book.append(new_req)
def get_max_value_of_type(self, req_type):
# pass
如上所示,我想了解如何有效地获取 RequestsBook
列表中与特定匹配的 Request
个实例中的最大值 value
输入.
例如:
rb = RequestsBook()
rb.add(Request(1, 'A', 100))
rb.add(Request(2, 'B', 42))
rb.add(Request(3, 'A', 78))
rb.add(Request(4, 'A', 12))
rb.get_max_value_of_type('A') # should return 190
rb.get_max_value_of_type('B') # should return 42
根据我的理解,我需要使用 functools.total_ordering 装饰器使 Request
class 具有可比性。
我以前从未使用过这个装饰器,我正在努力想出一种有效的方法来实现 get_max_value_of_type
。遗憾的是,这个用例的在线示例并不多。任何帮助将不胜感激。
此代码按类型排序,然后按值排序,然后检索最大值作为最后一项。它使用 sorted
内置的键函数,attrgetter
来自 operator
模块。它遵循 Python 文档 (3.10) 中的 Sorting HOWTO tutorial 中的解释。
from operator import attrgetter
class Request:
def __init__(self,request=(None,None,None)):
self.num, self.type, self.value = request
def __repr__(self):
return repr((self.num,self.type,self.value))
class RequestsBook(Request):
def __init__(rb):
Request.__init__(rb)
rb.bklist = []
rb.typetp = ('A','B','C')
def sortattr(rb,l,a):
return sorted(l,key=attrgetter(a))
def maxtype(rb):
typel = rb.sortattr(rb.bklist,'type')
maxl = []
for t in rb.typetp:
tl = [req for req in typel if req.type == t]
mtl = rb.sortattr(tl,'value')
maxl.append(mtl[-1])
return maxl
inputl = [(1,'A',100),(2,'B',40),(3,'C',30),(4,'A',40),(5,'A',10),(6,'A',80),(7,'C',30),(8,'C',10),(9,'B',70),(10,'B',90)]
bk = RequestsBook()
bk.bklist = [Request(i) for i in inputl]
maxtypel = bk.maxtype()
print('input: ',inputl)
print('output: ',maxtypel)