Python实现按过期天数统计冰箱食物数量的列表生成方法
搞定食物过期天数统计列表的问题
嘿,看起来你已经搭好了Food类和fridge列表的基础,现在要生成那个索引对应过期天数、值是对应天数食物数量的统计列表,还不想用一堆if语句堆出来,对吧?没问题,这有两个简洁又好用的实现方案:
方案1:手动用字典统计(不依赖额外库)
这个思路很直白:先把每个过期天数的食物数量数清楚,再找到最大的过期天数,最后生成一个从0到最大天数的列表,把对应天数的数量填进去就行,没有的就留0。
修改后的代码是这样的:
class Food: def __init__(self, name, expiration): self.name = name self.expiration = expiration fridge = [Food("beer",4), Food("steak",1), Food("hamburger",1), Food("donut",3)] def get_expiration_stats(fridge): # 第一步:统计每个过期天数有多少食物 count_dict = {} for food in fridge: exp_days = food.expiration # 天数已在字典里就加1,不在就初始化为1 count_dict[exp_days] = count_dict.get(exp_days, 0) + 1 # 处理空冰箱的情况 if not fridge: return [] # 找到最大的过期天数,确定列表长度 max_exp = max(food.expiration for food in fridge) # 生成统计列表,索引对应天数,值为数量 stats_list = [0] * (max_exp + 1) for day, count in count_dict.items(): stats_list[day] = count return stats_list # 测试一下 print(get_expiration_stats(fridge)) # 输出:[0, 2, 0, 1, 1]
对了,你提到期望输出是[0,2,1,1],估计是例子里beer的过期天数写成3了?如果把beer的expiration改成3,输出就会是[0,2,0,1],可能是笔误?不过不管怎样,这个方案会根据实际的最大过期天数自动生成正确的列表,很灵活。
方案2:用collections.Counter简化(更省心)
Python标准库的collections里有个Counter类,专门用来做计数统计,用它的话代码会短很多,可读性也强:
from collections import Counter class Food: def __init__(self, name, expiration): self.name = name self.expiration = expiration fridge = [Food("beer",4), Food("steak",1), Food("hamburger",1), Food("donut",3)] def get_expiration_stats(fridge): if not fridge: return [] # 先把所有食物的过期天数提取出来,用Counter统计 exp_days = [food.expiration for food in fridge] count_counter = Counter(exp_days) max_exp = max(exp_days) # 用列表推导式生成统计列表,没统计到的天数填0 stats_list = [count_counter.get(day, 0) for day in range(max_exp + 1)] return stats_list print(get_expiration_stats(fridge)) # 输出:[0, 2, 0, 1, 1]
这个方案完全不用写一堆if判断,Counter帮你搞定统计,列表推导式直接生成结果,简洁又高效。
顺便优化一下你原来的找最大过期天数的函数
你原来的exp函数可以简化不少,不用搞xen变量循环append,直接用max函数就行:
def get_max_expiration(fridge): if not fridge: return 0 # 或者根据需求返回None return max(food.expiration for food in fridge)
这样时间复杂度从O(n log n)降到了O(n),比原来的排序后pop要高效得多。
总之,这两个方案都完美避开了大量if语句,而且能适应任意的过期天数情况,不管你的fridge里有多少种不同的过期天数,都能正确生成统计列表。
内容的提问来源于stack exchange,提问作者Adam Beňko
相关产品推荐
相关产品推荐

