【问题标题】:Python equivalent of Java ComparatorJava 比较器的 Python 等价物
【发布时间】:2015-02-23 10:02:48
【问题描述】:

我正在尝试将一些对象插入 PriorityQueue。我没有实现任何比较类对象的方法,因为可以通过多种方式对对象进行排序。

我看到的一种方法是将对象作为 (obj.property, obj) 的元组插入到 PriorityQueue 中。这种方法对我来说的问题是 obj.property 对于多个对象通常是相同的,所以我得到一个 TypeError 因为对象是不可排序的类型。

我想做的是告诉 PriorityQueue 对 obj.property 进行排序,然后我不在乎如果它们的属性相同,会出现什么顺序对象。

最好的方法是什么?

【问题讨论】:

  • 您的问题与您的姓名不符。您在标题中询问__cmp__方法,但您的问题实际上是关于Queue.PriorityQueue的行为

标签: python python-3.x queue priority-queue


【解决方案1】:

根据docs

首先检索最低值的条目(最低值的条目 是 sorted(list(entries))[0]) 返回的那个。典型模式 for entries 是一个元组,格式为:(priority_number, data)。

更新:

您可以创建一个三元组以避免重复,如下所示:

>>> import queue
>>> class Foo(object):
...     def __init__(self, bar):
...         self.bar = bar
...
>>> f1 = Foo('foo')
>>> f2 = Foo('bar')
>>> f3 = Foo('baz')
>>> f4 = Foo('bar')
>>> q = queue.PriorityQueue()
>>> q.put((5,0,f1))
>>> q.put((3,0,f2))
>>> q.put((3,1,f3))
>>> q.put((1,0,f4))

或者(可能更简洁),实现magic methods

>>> import queue
>>> q = queue.PriorityQueue()
>>> class Foo(object):
...     def __init__(self, bar):
...         self.bar = bar
...     def __eq__(self, other):
...         return self.bar == other.bar
...     def __ne__(self, other):
...         return self.bar != other.bar
...     def __lt__(self, other):
...         return self.bar < other.bar
...     def __gt__(self, other):
...         return self.bar > other.bar
...     def __le__(self, other):
...         return self.bar <= other.bar
...     def __ge__(self, other):
...         return self.bar >= other.bar
...
>>> f1 = Foo('foo')
>>> f2 = Foo('bar')
>>> f3 = Foo('baz')
>>> f4 = Foo('baa')
>>> f5 = Foo('baz')
>>> q.put(f1)
>>> q.put(f2)
>>> q.put(f3)
>>> q.put(f4)
>>> q.put(f5)

【讨论】:

  • 是的。当我有两个具有相同priority_number 的对象时,就会出现问题。
  • 您可以创建一个三元组并计算元组第二部分的重复项。查看我的更新
  • @fdsa 重复应该不是问题;它们将以稳定排序的方式排序。这表明您实际上遇到了不同的问题。
  • 我使用了一个全局变量来跟踪插入 # 所以如果有一个“领带”,领带就会转到最先插入的元素。感谢您的帮助
【解决方案2】:

创建一个自定义类并实现正确的dunder method

【讨论】:

    猜你喜欢
    • 2010-12-25
    • 1970-01-01
    • 2016-10-10
    • 1970-01-01
    • 2016-06-10
    • 2011-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多