代码之家  ›  专栏  ›  技术社区  ›  dabadaba

SortedSet值错误不在列表中

  •  0
  • dabadaba  · 技术社区  · 8 年前

    我用的是 SortedSet 从 sortedcontainers 图书馆。集合包含 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 回复  |  直到 8 年前
        1
  •  0
  •   Dietrich Epp    8 年前

    匹配可能有相同的开始。匹配可以看到它们在集合中存在时开始改变。

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

    • 当元素位于容器中时,不能更改其排序顺序。容器无法知道排序顺序已更改。

    • 对象必须不同。

    如果您阅读了 sortedset ,它明确指出:

    值的哈希和总排序在存储在已排序集中时不得更改。

    • 因为元素存在,甚至根本不存在元素的总排序。 x != y 不是真的 x < y 或 x > y 是的。

    • 你没提到 __hash__ 完全。

    我不知道你会如何解决这些问题,因为我不熟悉你的代码,解决它们可能需要一些重新设计的工作。但是,这些问题是导致程序中出现意外行为的原因。