0

我正在尝试有效地解决以下问题:

给定以下课程

class Obj:
    t1: int
    t2: int

    def __hash__(self):
        # compute hash on frozenset to make sure switching the to and from id has no effect
        return hash(frozenset((self.t1, self.t2)))

    def __eq__(self, other: 'Obj'):
        pairs = (self.t1, self.t2)
        return other.r1 in pairs and other.t2 in pairs

因此,Obj(t1=1, t2=2) == Obj(t1=2, t2=1)

因此,给定一组Objass = {Obj(1, 2), Obj(1, 3), Obj(4, 1), Obj(9, 5)}我如何找到所有具有t1=1OR的对象t2=1?所以从上面的集合中我只会得到[Obj(1, 2), Obj(1, 3), Obj(4, 1)]

到目前为止我所尝试的:我目前的方法是对集合进行两次排序。一旦与s_t1 = sorted(s, lambda x: x.t1)s_t2 = sorted(s, lambda x: x.t2)

sortedcontainers使用方便,但也可以使用古典bisect

key = 1
from sortedcontainers import SortedKeyList
s_t1 = SortedKeyList(s, key=lambda x: x.t1)
s_t2 = SortedKeyList(s, key=lambda x: x.t2)

t1_results = s_t1[s_t1.bisect_key_left(key):s_t1.bisect_key_right(key)]
t2_results = s_t2[s_t2.bisect_key_left(key):s_t2.bisect_key_right(key)]
output = t1_restuls + t2_results

但是,这感觉效率低下,因为我需要排序两次。因此,我想知道什么是更好更快(!)的方法来做到这一点。特别是,在搜索列表时如何更好地利用这一事实Obj(t1=1, t2=2) == Obj(t1=2, t2=1)

4

0 回答 0