能否通过带条件的生成器表达式同时为两个变量赋值?
当然可以搞定!你现在的问题是重复写了几乎一样的生成器表达式,确实可以通过一次遍历+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
相关产品推荐
相关产品推荐

