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

如何匹配数组与字典迭代器并重构披萨价格计算函数?

重构披萨价格计算器以支持多配料列表

先修正你尝试代码里的错误

你写的这段遍历代码存在几个问题:

for j in toppingsMenu:
    for k in toppings:    
        if toppings[k] is j:
            print(toppingsMenu[j])
            toppingsAmount = toppingsMenu[j]
  • for k in toppings 里的k是列表中的配料名称字符串,不是索引,所以toppings[k]会直接报错(列表仅支持数字索引),直接用k匹配字典键即可。
  • 用is比较字符串是错误用法,is用于判断对象内存地址是否一致,判断字符串内容相等应该用==。
  • 你只做了价格赋值,没有累加逻辑,每次循环都会覆盖之前的价格,最终只能得到最后一个匹配配料的价格。

重构后的完整代码

利用字典get方法快速取值,结合生成器表达式实现多配料价格累加,代码简洁且逻辑清晰:

def pizzaPriceCalculator(sauce, toppings, loyalCustomer):
    sauceMenu = {
        "regular": 4.35,
        "alfredo": 4.6,
        "marinara": 5.85,
        "mix": 5.47
    }

    toppingsMenu = {
        "cheese": 0.5,
        "pepperoni": 0.75,
        "salami": 0.65,
        "olives": 1.0,
        "mushroom": 0.35
    }

    # 获取酱料价格,若输入酱料不在菜单中则返回0(可根据需求改为抛出错误)
    base_price = sauceMenu.get(sauce, 0.0)
    
    # 计算所有选中配料的总价,自动忽略不在菜单中的配料
    toppings_total = sum(toppingsMenu.get(topping, 0.0) for topping in toppings)
    
    # 计算折扣前总价
    price_before_discount = base_price + toppings_total
    
    # 应用忠诚客户折扣
    final_price = price_before_discount - 1.0 if loyalCustomer else price_before_discount
    
    print(f"最终价格: {final_price:.2f}")
    return final_price

# 调用示例
pizzaPriceCalculator("marinara", ["pepperoni", "cheese", "olives"], True)

关键逻辑说明

  1. 字典取值优化:无需遍历字典匹配,dict.get(key, default)可直接获取对应价格,若键不存在则返回默认值(这里用0.0,也可改成抛出ValueError提示无效选项)。
  2. 多配料求和:sum()结合生成器表达式,一行代码完成配料列表的价格累加,避免嵌套循环的逻辑混乱。
  3. 逻辑分层:将价格计算拆分为独立步骤,修正了原代码中baseTeaAmount这类明显的变量名错误。
  4. 字符串比较修正:通过get方法隐含键匹配逻辑,避免了is带来的潜在问题。

额外建议

  • 若需要对无效酱料/配料做强校验,可将get替换为直接取值+异常捕获:
    try:
        base_price = sauceMenu[sauce]
    except KeyError:
        raise ValueError(f"无效酱料: {sauce}")
    
  • 可将菜单字典移到函数外部,避免每次调用函数都重复创建字典,提升运行效率。

内容的提问来源于stack exchange,提问作者BBeknaz0904

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 12:25:32