Python实现合并两个字典列表中重复食材的数量
解决方案:合并相同食材的购物清单并导出Excel
针对你遇到的「相同食材(单位一致)重复显示」问题,提供两种解决方案:一种是利用Pandas的分组功能快速实现,另一种是纯Python循环逻辑(适合学习理解)。
方法一:用Pandas分组合并(高效简洁)
你已经在使用Pandas,直接用groupby按「食材名称+单位」分组,累加数量即可:
import pandas as pd friedRiceShrimp = [ {"Ingredient": "Garlic clove", "Size": "clove", "Quantity": 3, "Aisle": "Produce"}, {"Ingredient": "Instant Brown Rice", "Size": "oz", "Quantity": 16, "Aisle": 22}, {"Ingredient": "Soy Sauce", "Size": "tbsp", "Quantity": 2, "Aisle": 22}, {"Ingredient": "Chili Paste", "Size": "tbsp", "Quantity": 2, "Aisle": 22}, {"Ingredient": "Honey", "Size": "tbsp", "Quantity": 1, "Aisle": 18}, {"Ingredient": "Peanut Oil", "Size": "tbsp", "Quantity": 2, "Aisle": 21}, {"Ingredient": "Shrimp", "Size": "oz", "Quantity": 10, "Aisle": 12}, {"Ingredient": "Egg", "Size": "individual", "Quantity": 3, "Aisle": "Dairy"}, {"Ingredient": "Snap Peas", "Size": "cup", "Quantity": 1.5, "Aisle": "Produce"}, {"Ingredient": "Peanuts Dry-Roasted", "Size": "cup", "Quantity": .3, "Aisle": 14} ] macNCheese = [ {"Ingredient": "Bacon", "Size": "Slice", "Quantity": 6, "Aisle": 8}, {"Ingredient": "Chicken Stock", "Size": "cup", "Quantity": 2, "Aisle": 24}, {"Ingredient": "Milk", "Size": "cup", "Quantity": 1, "Aisle": "Dairy"}, {"Ingredient": "Butternut Squash puree", "Size": "oz", "Quantity": 10, "Aisle": "Produce"}, {"Ingredient": "Macaroni Elbow Pasta", "Size": "oz", "Quantity": 10, "Aisle": 23}, {"Ingredient": "Broccoli", "Size": "cup", "Quantity": 3, "Aisle": "Produce"}, {"Ingredient": "Cheddar Cheese Shredded", "Size": "oz", "Quantity": 5, "Aisle": 8}, {"Ingredient": "Garlic clove", "Size": "clove", "Quantity": 2, "Aisle": "Produce"} ] # 合并所有食谱 shopping_list = friedRiceShrimp + macNCheese df = pd.DataFrame(shopping_list) # 按「食材名称+单位」分组,累加数量,其他列取第一个值(若同一食材不同食谱 aisle 不同,可改成"list"保留所有值) merged_df = df.groupby(["Ingredient", "Size"], as_index=False).agg({ "Quantity": "sum", "Aisle": "first" }) # 导出到Excel merged_df.to_excel("Shopping_List.xlsx", index=False)
方法二:纯Python循环实现(适合学习)
如果想手动实现逻辑,用字典跟踪已有的「食材+单位」组合,避免重复遍历列表:
friedRiceShrimp = [ # 原食材数据不变 ] macNCheese = [ # 原食材数据不变 ] shopping_list = friedRiceShrimp + macNCheese final_dict = {} for item in shopping_list: # 用「食材名称+单位」作为唯一标识键 key = (item["Ingredient"], item["Size"]) if key in final_dict: # 数量累加 final_dict[key]["Quantity"] += item["Quantity"] else: # 复制条目存入字典,避免修改原列表数据 final_dict[key] = item.copy() # 转换为列表格式 final_list = list(final_dict.values()) # 导出到Excel import pandas as pd df = pd.DataFrame(final_list) df.to_excel("Shopping_List.xlsx", index=False)
你原有代码的问题说明
- 初始
final_list为空时,访问final_list[0]会直接报错 - 仅检查列表第一个元素,未遍历所有已添加的食材
- 未考虑「单位一致」的匹配条件,仅匹配了食材名称
内容的提问来源于stack exchange,提问作者Erik
相关产品推荐
相关产品推荐

