【问题标题】:Create a priority queue with reverse order创建具有相反顺序的优先级队列
【发布时间】:2014-08-13 19:31:11
【问题描述】:

我创建了一个名为Element的新类o对象,它有很多值'degree'

class Element(object):
 def __init__(self, name, i):
  self.name = name
  self.degree = i
  # some other values

 #some other functions

 def __cmp__(self, other):
  return cmp(self.degree, other.degree)

我想创建一个包含这些元素的优先级队列:

que = Queue.PriorityQueue()
que.put(Element('element1', 23))
que.put(Element('element2', 45))
que.put(Element('element3', 11))

while not que.empty():
 next_el = que.get()
 print next_el.name + " " + next_el.degree

程序将打印:

element3 11
element1 23
element2 45

但我想拥有:

element2 45
element1 23
element3 11

所以我想使度值较大的元素具有较高的优先级并被优先考虑。 而第二个问题是:如果两个元素的度数相同,它们的取值顺序是什么?

【问题讨论】:

  • 然后进行不同的比较。你的第一个问题并不是一个真正的问题。第二个问题是:无论您以哪种方式定义比较器。 Equals 也必须返回 true 或 false。

标签: python queue priority-queue


【解决方案1】:

您可以修改Element类的比较方法来颠倒顺序:

def __cmp__(self, other):
  return -cmp(self.degree, other.degree)

否定cmp的返回会使队列倒转,因为__cmp__根据比较的结果返回正数、负数或零:

cmp(a, b) <  0: a <  b
cmp(a, b) >  0: a >  b
cmp(a, b) == 0: a == b

【讨论】:

    【解决方案2】:

    你可以用这个方法来比较:

    def __cmp__(self, other):
        return -cmp(self.degree, other.degree)
    

    如果element1.degree &gt; element2.degree,这将使element1 &lt; element2

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-02
      • 1970-01-01
      • 2021-11-29
      • 1970-01-01
      • 2011-01-18
      相关资源
      最近更新 更多