首页 > 解决方案 > SortedSet ValueError 不在列表中

问题描述

我正在使用SortedSetsortedcontainers中的一个。该集合包含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会悄悄地移除。

我完全不知道为什么会发生这种情况,并且我已经尝试了几天的解决方案,但还没有成功。如果我有任何可能出错的线索,我会提供更多信息,但我只是一无所知。请询问您需要的任何信息,我将提供。

标签: pythonpython-2.7

解决方案


比赛可能有相同的开始。匹配在集合中存在时可能会看到它们的开始发生变化。

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

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

  • 对象必须不同。

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

值的散列和总排序在存储在排序集中时不得更改。

  • x != y您的元素x < y甚至不存在总排序,因为存在x > y.

  • 你根本没有提到__hash__

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


推荐阅读