Python字典值累加而非覆盖的实现问题
问题需求
我是编程新手,需要从存储购买商品信息的CSV文件中,把已过期商品的数量累加后存入字典。但当前代码会将字典中商品的数量覆盖为最后一行的值,无法实现累加,求修改方法。
CSV示例数据
id,product_name,buy_date,buy_price,quantity,exp_date 1,apple,2022-01-26,0.8,38,2022-01-10 2,apple,2022-01-26,0.8,71,2022-01-10 3,banana,2022-01-26,0.8,62,2022-01-10 4,banana,2022-01-26,0.8,51,2022-01-10 5,grape,2022-01-26,1,45,2022-01-10 6,grape,2022-01-26,1,31,2022-01-10
当前代码及错误输出
代码
expired_dict ={} with open("bought.csv", "r") as File: for row in csv.DictReader(File): if today() > row["exp_date"]: expired_dict.update({row["product_name"]:[row["quantity"]]})
错误输出
{'apple': ['71'], 'banana': ['51'], 'grape': ['31']}
解决方法
问题根源
当前代码用update方法直接覆盖字典条目,且把数量存成了字符串列表,完全没有累加逻辑,所以只会保留最后一行的数值。要实现累加,需要调整核心逻辑:
修改后的基础版代码
import csv from datetime import datetime def today(): # 确保返回的日期格式和CSV中的一致 return datetime.now().strftime("%Y-%m-%d") expired_dict ={} with open("bought.csv", "r") as File: reader = csv.DictReader(File) for row in reader: # 把日期字符串转成datetime对象,避免字符串直接比较的潜在问题 exp_date = datetime.strptime(row["exp_date"], "%Y-%m-%d") current_date = datetime.strptime(today(), "%Y-%m-%d") if current_date > exp_date: product = row["product_name"] # CSV读取的数量是字符串,必须转成整数才能累加 quantity = int(row["quantity"]) # 判断商品是否已在字典中,存在则累加,不存在则初始化 if product in expired_dict: expired_dict[product] += quantity else: expired_dict[product] = quantity
简化版(用collections.defaultdict)
如果不想每次判断商品是否存在,可以用defaultdict自动初始化值为0,代码更简洁:
import csv from datetime import datetime from collections import defaultdict def today(): return datetime.now().strftime("%Y-%m-%d") # 默认值为0,无需手动判断初始化 expired_dict = defaultdict(int) with open("bought.csv", "r") as File: reader = csv.DictReader(File) for row in reader: exp_date = datetime.strptime(row["exp_date"], "%Y-%m-%d") current_date = datetime.strptime(today(), "%Y-%m-%d") if current_date > exp_date: product = row["product_name"] quantity = int(row["quantity"]) expired_dict[product] += quantity
正确输出
{'apple': 109, 'banana': 113, 'grape': 76}
内容的提问来源于stack exchange,提问作者Seantjuh91
相关产品推荐
相关产品推荐

