搜索类的 SortedList

问题描述 投票:0回答:1

我有一个类的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

然而,这感觉是一种丑陋的做法。 是否有另一个选项不依赖于我创建自己的二分搜索函数?

python search sortedlist
1个回答
0
投票

不使用

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
© www.soinside.com 2019 - 2024. All rights reserved.