微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用丢弃时的Python SortedSet ValueError

如何解决使用丢弃时的Python SortedSet ValueError

我使用 SortedSet 按排序顺序存储对象。即使对象确实在列表中,我也不断收到不在列表中的 ValueError 对象。

这是一个可重现的例子

from sortedcontainers import SortedSet

a = SortedSet()

class example:
    def __init__(self,p,id):
        self.p = p
        self.id = id
    def __lt__(self,other):
        return self.p < other.p
 


a.add(example(5,1))
x = example(5,2)
a.add(x)

if x in a:
    print("found")
    a.discard(x)

在这个例子中,“found”被打印出来,我得到 ValueError: <__main__.example object at 0x7fc19ebb2400> not in list

我一直试图弄清楚为什么这几个小时都失败了,我非常感谢您的帮助。

编辑: 这是完整的回溯

Traceback (most recent call last):
  File "/CLD/clockwork-rl/work/Clockwork-RL/temp.py",line 18,in <module>
    a.discard(x)
  File "/home/salzayat/.local/lib/python3.7/site-packages/sortedcontainers/sortedset.py",line 422,in discard
    self._list.remove(value)
  File "/home/salzayat/.local/lib/python3.7/site-packages/sortedcontainers/sortedlist.py",line 462,in remove
    raise ValueError('{0!r} not in list'.format(value))
ValueError: <__main__.example object at 0x7f3783488400> not in list

编辑 2:

我更新了代码以修复丢失的返回值,但仍然产生错误

我现在明白我还需要为 id 添加条件。我不确定为什么这是必要的,因为它可以检测到 x 在有序集中并且 found 仍在打印

解决方法

你忘了return self.p < other.p

,

您班级的方法不一致。您尚未实现一整套比较方法或 __hash__ 方法。你所拥有的只是__lt__

此外,您将 __lt__ 实现为 return self.p < other.p 的方式意味着就您的订单比较而言,example(5,1)example(5,2) 是相等的(相反您继承的 __eq__ 的行为方式)。如果您希望能够在同一个 SortedSet 中存储具有相等 p 值的两个对象,则您的比较运算符必须能够区分这两个对象。

由于您的方法不一致,它们向 SortedSet 实现报告了相互矛盾的信息。实现的基于哈希和 == 的部分认为您的对象不同,但实现的基于 < 的部分认为您的对象相等,因此 SortedSet 变得非常混乱。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。