class PriorityQueue:
def __init__(self):
self.q = []
def enqueue(self, priority, item):
self.q.append([priority, item])
self.q = sorted(self.q)
return self.q
x = PriorityQueue()
print(x.enqueue(3, "Potato"))
y = PriorityQueue()
print(y.enqueue(1, "Egg"))
我正在尝试列出优先级列表,但它无法排序。
输出;
[[3, 'Potato']]
[[1, 'Egg']]
我该如何解决这个问题?
你总是在创建一个新的
PriorityQueue
,我猜你想要一个队列:
class PriorityQueue:
def __init__(self):
self.q = []
def enqueue(self, priority, item):
self.q.append([priority, item])
self.q = sorted(self.q)
return self.q
y = PriorityQueue()
print(y.enqueue(3, "Egg"))
print(y.enqueue(4, "Potato"))
print(y.enqueue(2, "Chesse"))
print(y.enqueue(1, "Cake"))
出:
[[3, 'Egg']]
[[3, 'Egg'], [4, 'Potato']]
[[2, 'Cheese'], [3, 'Egg'], [4, 'Potato']]
[[1, 'Cake'], [2, 'Cheese'], [3, 'Egg'], [4, 'Potato']]
在此代码中,您有一个类 ->
PriorityQueue
,它继承了一个列表 "q"
。
现在,代码创建了两个类型为 PriorityQueue
x 和 y 的对象,它们彼此独立。
这也意味着它们各自的列表"q"
是彼此独立的。
测试下面的代码。会让整个过程更加生动
class PriorityQueue:
def __init__(self):
self.q = []
def enqueue(self, priority, item):
self.q.append([priority, item])
self.q = sorted(self.q)
return self.q
grocerys = PriorityQueue()
print(grocerys.enqueue(3, "Potato"))
print(grocerys.enqueue(6, "Milk"))
print(grocerys.enqueue(1, "Egg"))
print("this is your grocery.q list", grocerys.q)
media = PriorityQueue()
print(media.enqueue(1, "PC"))
print(media.enqueue(3, "Television"))
print(media.enqueue(2, "Moonboard"))
print("this is your media.q list", media.q)
您有 2 个独立的对象。你正在排队这两个对象。这就是为什么你会得到单独的队列,这并不奇怪。
class PriorityQueue:
def __init__(self):
self.q = []
def enqueue(self, priority, item):
self.q.append([priority, item])
self.q.sort(key=lambda x:x[0])
return self.q
x = PriorityQueue()
print(x.enqueue(3, "Potato"))
print(x.enqueue(1, "Egg"))
输出:
[[3, 'Potato']]
[[1, 'Egg'], [3, 'Potato']]
您一次又一次地对列表进行排序。这不是实现优先级队列的正确方法。更好的方法是使用堆。
这是一个示例:
import heapq
h = []
h.append([3, "Potato"])
h.append([1, "Egg"])
heapq.heapify(h)
print(h)
输出:
[[1, 'Egg'], [3, 'Potato']]
要从堆中弹出,您可以使用
heapq.heappop(h)
等。查看 docs 了解更多信息。
class PriorityQueue:
def __init__(self):
self.items = []
def size(self):
return len(self.items)
def enqueue(self, item):
self.items.append(item)
self.items.sort()
def dequeue(self):
if self.size() == 0:
return None
return self.items.pop(0)
def __repr__(self):
return f"{[item for item in self.items]}"
if __name__ == '__main__':
q = PriorityQueue()
q.enqueue([3, "Potato"])
q.enqueue([1, "Egg"])
print(q)
item_to_process = q.dequeue()
print(item_to_process)
结果
[[1, Egg], [3, Potato]]
[1, 'Egg']