创建一个逆序优先队列

2 投票
2 回答
1918 浏览
提问于 2025-04-18 17:11

我创建了一个新的类或对象,叫做 Element,它有很多值叫做 '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

所以我想让 degree 值更大的元素优先被取出。还有第二个问题是:如果两个元素的 degree 值相同,它们会按照什么顺序被取出呢?

2 个回答

1

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

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

这样的话,如果 element1.degree > element2.degree,那么 element1 < element2 就成立了。

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

撰写回答