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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:55:12