我有一个类的SortedList,例如...
from typing import List
from sortedcontainers import SortedList
class Supplier:
def __init__(self, name: str, id: int, sap_id: int):
self.Name = name
self.Id = id
self.SapId = sap_id
class Data:
def __init__(self):
self.suppliers = SortedList(key=lambda x: x.Name.lower())
我希望能够根据供应商名称搜索 SortedList
比如...
# Part of the Data class
def find_supplier(self, name:str):
index = self.suppliers.bisect_left(name)
if index != len(self.suppliers) and self.suppliers[index].Name.lower() == name.lower():
return self.suppliers[index]
return None
但是这不起作用,因为 bisect_left 传递了一个 str,并且它需要一个供应商。 我可以通过创建临时供应商并向其添加名称,然后以这种方式搜索来解决此问题,例如...
# Part of the Data class
def find_supplier(self, name:str):
temporary_supplier = Supplier(name, 0, 0)
index = self.suppliers.bisect_left(temporary_supplier)
if index != len(self.suppliers) and self.suppliers[index].Name.lower() == name.lower():
return self.suppliers[index]
return None
然而,这感觉是一种丑陋的做法。 是否有另一个选项不依赖于我创建自己的二分搜索函数?
不使用
SortedList
的自定义键函数或在调用 Supplier
时创建临时 bisect_left
,更简洁的方法可能是通过定义一种丰富的比较方法并使其接受字符串来使 Supplier
具有可比性作为另一个操作数:
class Supplier:
def __init__(self, name: str):
self.Name = name
def __repr__(self):
return self.Name
def __lt__(self, other):
if isinstance(other, str):
return self.Name < other
return self.Name < other.Name
这样:
class Data:
def __init__(self):
self.suppliers = SortedList()
def find_supplier(self, name: str):
index = self.suppliers.bisect_left(name)
if index != len(self.suppliers) and self.suppliers[index].Name.lower() == name.lower():
return self.suppliers[index]
d = Data()
d.suppliers.update([Supplier('B'), Supplier('A')])
print(d.suppliers)
print(d.find_supplier('A'))
输出:
SortedList([A, B])
A