You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为每位客户创建字典队列?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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 08:35:28