我正在使用sortedcontainers库中的SortedSet
。该集合包含Match
个对象,这些对象定义了一个start
属性,该属性用于排序:
class Match:
def __lt__(self, other):
return self.start < other.start
匹配会不断添加(SortedSet.add
),并从集合中丢弃(SortedSet.discard
)。
比赛的起点可能相同。当比赛存在于比赛中时,比赛的开始可能会发生变化。
在尝试丢弃匹配项sortedset.discard(match)
时出现以下错误之前,一切似乎都没有问题,
ValueError: <Match: X vs Y> not in list
集合match
中存在match in sortedset
,返回True
。没关系,因为discard
会悄悄删除。
我完全不知道为什么会这样,而且几天来我一直在努力寻找解决方案,但尚未成功。如果我对可能出了什么问题有任何线索,我会提供更多信息,但我只是一无所知。请询问您需要的任何信息,我会提供。
答案 0 :(得分:0)
比赛的起点可能相同。当比赛存在于比赛中时,比赛的开始可能会发生变化。
这违反了容器用来跟踪其元素的约束。
您不能更改元素在容器中时的排序顺序。容器无法知道排序顺序已更改。
对象必须不同。
如果您阅读sortedset
的文档,则会清楚地声明:
将值存储在排序集中时,哈希值和总顺序不得更改。
甚至不存在元素的总排序,因为存在x != y
,其中x < y
或x > y
都不成立。
您根本没有提到__hash__
。
我不确定您如何解决这些问题,因为我对您的代码不熟悉,要解决这些问题可能需要重新设计。但是,这些问题是导致程序意外行为的原因。