我正在尝试有效地解决以下问题:
给定以下课程
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)
因此,给定一组Obj
ass = {Obj(1, 2), Obj(1, 3), Obj(4, 1), Obj(9, 5)}
我如何找到所有具有t1=1
OR的对象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)
?