SortedSet ValueError不在列表中

时间:2018-07-13 10:05:43

标签: python python-2.7

我正在使用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会悄悄删除。

我完全不知道为什么会这样,而且几天来我一直在努力寻找解决方案,但尚未成功。如果我对可能出了什么问题有任何线索,我会提供更多信息,但我只是一无所知。请询问您需要的任何信息,我会提供。

1 个答案:

答案 0 :(得分:0)

  

比赛的起点可能相同。当比赛存在于比赛中时,比赛的开始可能会发生变化。

这违反了容器用来跟踪其元素的约束。

  • 您不能更改元素在容器中时的排序顺序。容器无法知道排序顺序已更改。

  • 对象必须不同。

如果您阅读sortedset的文档,则会清楚地声明:

  

将值存储在排序集中时,哈希值和总顺序不得更改。

  • 甚至不存在元素的总排序,因为存在x != y,其中x < yx > y都不成立。

    < / li>
  • 您根本没有提到__hash__

我不确定您如何解决这些问题,因为我对您的代码不熟悉,要解决这些问题可能需要重新设计。但是,这些问题是导致程序意外行为的原因。