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

能否通过带条件的生成器表达式同时为两个变量赋值?

当然可以搞定!你现在的问题是重复写了几乎一样的生成器表达式,确实可以通过一次遍历+if-else的逻辑同时给两个变量赋值,既减少重复代码还能提升效率——毕竟原来的写法要遍历字典两次,改成单次遍历更划算。下面给你几种实用的实现方式:

方案1:单次循环累加(首推,可读性拉满)

先初始化两个计数器,然后遍历字典的每一项,用if-else判断归属,分别累加:

# 你的原始数据
cheese_inventory = {"切达奶酪": 15, "布里奶酪": 8, "马苏里拉奶酪": 22, "蓝纹奶酪": 5}
promo_cheeses = {"切达奶酪", "蓝纹奶酪"}

# 初始化计数器
sale_count = 0
full_price_count = 0

# 一次遍历完成统计
for cheese, qty in cheese_inventory.items():
    if cheese in promo_cheeses:
        sale_count += qty
    else:
        full_price_count += qty

print(f"促销奶酪总数: {sale_count}, 全价奶酪总数: {full_price_count}")

这种写法逻辑清晰,哪怕是新手也能一眼看懂,而且只遍历一次字典,数据量大的时候优势很明显。

方案2:紧凑的生成器写法(适合喜欢简洁代码的场景)

如果你偏爱生成器的风格,可以通过生成包含两个值的元组,再分别求和:

cheese_inventory = {"切达奶酪": 15, "布里奶酪": 8, "马苏里拉奶酪": 22, "蓝纹奶酪": 5}
promo_cheeses = {"切达奶酪", "蓝纹奶酪"}

# 生成(促销数量, 全价数量)的元组序列,再拆分求和
sale_tuples, full_price_tuples = zip(*(
    (qty, 0) if cheese in promo_cheeses else (0, qty) 
    for cheese, qty in cheese_inventory.items()
))

sale_count = sum(sale_tuples)
full_price_count = sum(full_price_tuples)

print(f"促销奶酪总数: {sale_count}, 全价奶酪总数: {full_price_count}")

这种写法代码更紧凑,但可读性不如第一种,适合对Python生成器比较熟悉的情况。

方案3:分类统计(扩展性更强)

如果之后你可能需要新增更多分类(比如新品、临期奶酪),可以先把奶酪按类别分组再求和:

from collections import defaultdict

cheese_inventory = {"切达奶酪": 15, "布里奶酪": 8, "马苏里拉奶酪": 22, "蓝纹奶酪": 5}
promo_cheeses = {"切达奶酪", "蓝纹奶酪"}

# 用defaultdict自动初始化分类计数器
counts = defaultdict(int)

for cheese, qty in cheese_inventory.items():
    # 判断当前奶酪属于哪个分类
    category = "促销" if cheese in promo_cheeses else "全价"
    counts[category] += qty

# 提取结果
sale_count = counts["促销"]
full_price_count = counts["全价"]

print(f"促销奶酪总数: {sale_count}, 全价奶酪总数: {full_price_count}")

这种方式以后要加新分类,只需要修改category的判断逻辑就行,扩展性拉满。

总的来说,首推第一种方案,兼顾可读性和效率,完美解决你重复代码的问题~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:41:42