Python排序,并在队列中最后添加了元素

时间:2018-11-10 16:23:42

标签: python python-3.x sorting

实际上我的排序算法有效,但是有一个问题。 我有一个名为SortedItem的类,其中包括

def __init__(self, point, cost):
    self.coordinate = point
    self.cost = cost

还有一个优先级队列,该队列按其费用对SortedItem进行排序:

class PriorityQueue:

def __init__(self):
    self.items = []

def isEmpty(self):
    return self.items == []

def sortComparatorByCost(self, item):
    return item.cost

def enqueue(self, item):
    self.items.append(item)
    self.items.sort(key=self.sortComparatorByCost, reverse=True)


def dequeue(self):
    return self.items.pop()

def returnQueueAsString(self):
    queue_str = ""
    for eachItem in self.items:
        queue_str += str(eachItem) + " "
    return queue_str

def isQueueContainsElement(self, element):
    for eachElement in self.items:
        if eachElement[0] == element:
            return True
    return False

此问题发生在这里: -我定义了一些添加队列的命令。假设我要将这个对象添加到队列中:

obj1 = SortedItem((1,0), 10))
queue.enqueue(obj1)
obj2 = SortedItem((2,0), 15))
queue.enqueue(obj2)
obj3 = SortedItem((2,1), 15))
queue.enqueue(obj3)
  • 现在我必须按此顺序从队列中获取对象(obj1,obj2,obj3)。
  • 但是python内置的sort函数对这些对象进行如下排序:(obj1,obj3,obj2)(因为obj2和obj3的成本相同)
  • 我该如何解决此问题。我的意思是,如果2个对象的成本相同,则应该添加第一个对象。

请注意:我刚刚创建了一个简单的问题示例。如果您尝试使用此代码,则可以按以下顺序获取对象:obj1,obj2,obj3

1 个答案:

答案 0 :(得分:2)

与其以相反的顺序对项目进行排序并将其从右侧删除,

def enqueue(self, item):
    self.items.append(item)
    self.items.sort(key=self.sortComparatorByCost, reverse=True)

def dequeue(self):
    return self.items.pop()

您可以从左侧将其删除。这样可以避免以相同的成本颠倒物品的插入顺序。

def enqueue(self, item):
    self.items.append(item)
    self.items.sort(key=self.sortComparatorByCost)

def dequeue(self):
    return self.items.pop(0)

但是,从列表is not efficient的开头删除项目,因此最好使用deque(用pop(0)替换popleft())来解决。另一方面,deque没有就地sort()方法,因此也需要用self.items.sort()替换self.items = deque(sorted(self.items))