如何为每位客户创建字典队列?Python初学者的实现疑问
字典队列实现问题与解决方案(Python)
我是一名Python初学者,作业要求创建字典队列,但不清楚如何在列表内实现。以下是我的测试代码(非功能性代码,仅用于学习):
class Queue: def __init__(self): self.items = [] def size(self): return len(self.items) def enqueue(self, item): self.items.append(item) def dequeue(self): if self.size() == 0: return None return self.items.pop(0) def show_queue(self): print(self.items) # CODE CHALLENGE class IceCreamShop: order = { "customer" : "", "flavor" : "", "scoops" : "", } def __init__(self, flavors): self.flavors = flavors order = Queue() def take_order(self, customer, flavor, scoops): if flavor in self.flavors and scoops in range(1, 4): for orders in self.order: self.order["customer"] = customer self.order["flavor"] = flavor self.order["scoops"] = scoops print("Order Created!") print(self.order) return self.order else: print("Sorry, we don't have that flavor.\n Pick another flavor or less scoops.") def show_all_orders(self): for orders in self.order.values(): print(self.order) def next_order(self): # show next order in queue print("Next Order...") shop = IceCreamShop(["rocky road", "mint chip", "pistachio"]) shop.take_order("Zachary", "pistachio", 3) shop.take_order("Marcy", "mint chip", 1) shop.take_order("Leopold", "vanilla", 2) shop.take_order("Bruce", "rocky road", 0) shop.show_all_orders() shop.next_order() shop.show_all_orders()
疑问解答
1. 如何将每位客户对应的字典保存到队列中?
在IceCreamShop的__init__方法里初始化一个Queue实例作为类的实例属性(比如self.orders = Queue()),每次创建有效订单时,生成一个独立的字典对象存储该客户的订单信息,再调用队列的enqueue方法将这个字典加入队列。
2. 如何对每位客户的字典执行enqueue(入队)和dequeue(出队)操作?
- 入队:在
take_order方法中,创建好单个订单的字典后,调用self.orders.enqueue(订单字典),就能把该订单加入队列末尾。 - 出队:在
next_order方法中,调用self.orders.dequeue(),会取出队列头部的订单字典,之后可以对这个字典进行操作(比如打印)。
3. take_order函数能返回Zachary和Marcy两位不同客户的订单,但show_all_orders函数却只打印出Marcy的订单,这是为什么?
你定义的order是类属性,所有IceCreamShop的实例都会共享这同一个字典对象。每次调用take_order时,都是修改同一个字典的内容,后创建的订单会直接覆盖之前的订单数据,所以show_all_orders打印的永远是最后一次修改的那个订单字典。
修正后的解决方案代码
以下是调整后的可运行代码,用循环实现了订单列表的打印,分享给有需要的人:
# CODE CHALLENGE class IceCreamShop: def __init__(self, flavors): self.flavors = flavors self.orders = Queue() def take_order(self, customer, flavor, scoops): if flavor in self.flavors and scoops in range(1, 4): order = dict() order["customer"] = customer order["flavor"] = flavor order["scoops"] = scoops self.orders.enqueue(order) print("Order Created!") else: print("\nSorry, we don't have that flavor.\nPick another flavor or less scoops.\n") def show_all_orders(self): print("\nAll Pending Ice Cream Orders:") for orders in self.orders.items: print(("Customer: " + orders["customer"]), ("-- Flavor: " + orders["flavor"]), ("-- Scoops:" + str(orders["scoops"]))) def next_order(self): print("\nNext Order Up!") order = self.orders.dequeue() print(("Customer: " + order["customer"]), ("-- Flavor: " + order["flavor"]), ("-- Scoops:" + str(order["scoops"]))) shop = IceCreamShop(["rocky road", "mint chip", "pistachio"]) shop.take_order("Zachary", "pistachio", 3) shop.take_order("Marcy", "mint chip", 1) shop.take_order("Leopold", "vanilla", 2) shop.take_order("Bruce", "rocky road", 0) shop.show_all_orders() shop.next_order() shop.show_all_orders()
内容的提问来源于stack exchange,提问作者Joi
相关产品推荐
相关产品推荐

