Python SortedSet ValueError不在列表中

Python SortedSet ValueError不在列表中,python,python-2.7,Python,Python 2.7,我正在使用库中的SortedSet。该集合包含定义用于排序的start属性的Match对象: class Match: def __lt__(self, other): return self.start < other.start match出现在集合中,因为match in sortedset返回True。这并不重要,因为discard会悄悄地删除 我完全不知道为什么会发生这种情况,几天来我一直在试图找到一个解决方案,但还没有成功。如果我有任何可能出错的线索,

我正在使用库中的
SortedSet
。该集合包含定义用于排序的
start
属性的
Match
对象:

class Match:
    def __lt__(self, other):
        return self.start < other.start
match
出现在集合中,因为
match in sortedset
返回
True
。这并不重要,因为
discard
会悄悄地删除

我完全不知道为什么会发生这种情况,几天来我一直在试图找到一个解决方案,但还没有成功。如果我有任何可能出错的线索,我会提供更多的信息,但我就是不知道。请询问您需要的任何信息,我将提供

匹配可能有相同的开始。当匹配项存在于集合中时,可能会看到其开始更改

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

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

  • 对象必须不同

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

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

  • 甚至不存在元素的总排序,因为存在
    x!=y
    其中
    x
    x>y
    都不是真的

  • 您根本没有提到
    \uuuuuuuuuuuuuuuuuuuuuuuuuu


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

您能添加一个吗?@Graipher阅读了我的最后一段:“如果我对可能出现的错误有任何线索,我会提供更多信息,但我只是一无所知。”我不知道为什么会发生这种情况;它工作一段时间,然后停止工作。为什么?不知道。然后从头开始,尝试构造一个最小的示例来说明这个问题(例如,只添加一个元素,然后再次删除它)。如果无法重现问题,我们几乎不可能帮助您(除非您以前遇到过此问题,并且仅从您的描述中认识到此问题,这是不可能的)。@Graipher我无法重现显示此问题的示例。我试过了。问题永远不会发生。这只发生在我的项目中,谁知道为什么。您可以尝试查看sortedset中的
是否匹配。\u list
,它是存储订单的基础列表(当
self.\u list.remove(value)
在内部被调用时,它会引发
ValueError
)。可能是匹配的某些更改没有正确地传播到该内部列表中。我完全错过了文档中的这一部分,我认为对象可能是可变的。我不知道你的最后两点是什么意思。您建议我如何修改数据结构选择以满足我的需要?对象可以是可变的。他们在场时,你不能改变他们的位置。想象一下,我给你一套书,你把它们按字母顺序放在书架上。然后,在晚上,我偷偷溜进你的房间,改变书名,这样它们就不再按字母顺序排列了。这就是你正在做的。不能更改它们的
开始
是否意味着它们是可变的?也许我误解了这个概念。在任何情况下,我仍然缺少我提到的那部分答案。您可以更改
start
,但是(1)您不能更改集合中对象的总顺序,(2)您不能更改集合中任何对象的哈希。通常,最简单的方法是在对象键位于集合中时不更改它们,最简单的方法是使对象键不可变。当然,你可以自由地为自己制造困难。但是重新设计您的系统可能更容易,所以您不需要为集合中的对象更改对象键。@DeitrichEpp这些键不会更改。键是
Match
对象。这是
匹配。开始
什么变化。如何更改对象的顺序?
ValueError: <Match: X vs Y> not in list