Python字典列表删除元素报错,请求代码修正方案
修正你的杂货列表删除问题
核心问题与修改点
1. 删除逻辑的匹配错误
你当前把整个字典转成字符串去和商品名比较,这完全不对——比如字典{"Item name": "Egg", "price": 2.5, "quantity": 1}转成字符串后是"{'Item name': 'Egg', 'price': 2.5, 'quantity': 1}",和输入的"egg"根本无法匹配。另外.format()在这里完全是多余的,没有任何作用。
修改代码:
# 原代码 remove_item = str(input("What would you like to remove? \nItem name: ")).format() grocery_list = [i for i in hist_grocery if str(i).lower() != remove_item] # 修改后 remove_item = input("What would you like to remove? \nItem name: ").strip().lower() # 直接匹配字典里的Item name字段 hist_grocery = [item for item in hist_grocery if item["Item name"].lower() != remove_item]
2. 未更新原列表
你之前只是把过滤后的列表赋值给了grocery_list,但真正存储所有商品的是hist_grocery,所以必须把过滤结果赋值给它,否则原列表不会有任何变化。
3. 打印列表的变量混淆
打印时你用了grocery_list.values(),但grocery_list在添加商品时是单个字典,删除操作后变成了列表,变量复用导致类型混乱,会触发AttributeError(列表没有values()方法)。
修改打印部分代码:
# 原代码 [print(items, end=" ") for items in grocery_list.values()] # 修改后 for item in hist_grocery: print(f"商品名: {item['Item name']}, 单价: {item['price']}, 数量: {item['quantity']}")
修正后的完整代码
print(" MY NEW AND IMPROVED GROCERY LIST ") def grocerylist(): hist_grocery = [] grocery = True while grocery: choice = input(""" ===================== What would you like to do? 1 - Add an item 2 - Remove an item 3 - Print entire list 4 - Calculate cost 5 - Exit program Choice: """) if choice == "1": print("""===================== ADD AN ITEM """) information = input("Give the following information: Item name: ").strip() price = float(input("Item price: ").strip()) quantity = int(input("Item quantity: ").strip()) grocery_item = {"Item name": information, "price": price, "quantity": quantity} hist_grocery.append(grocery_item) elif choice == "2": print("""===================== REMOVE AN ITEM """) remove_item = input("What would you like to remove? \nItem name: ").strip().lower() # 过滤掉要删除的商品,更新原列表 hist_grocery = [item for item in hist_grocery if item["Item name"].lower() != remove_item] print(f"已移除所有名为 {remove_item.title()} 的商品") elif choice == "3": print("""===================== PRINTING LIST...""") if not hist_grocery: print("The grocery list is empty!") else: print("当前杂货列表:") for idx, item in enumerate(hist_grocery, 1): print(f"{idx}. 商品名: {item['Item name']}, 单价: ${item['price']:.2f}, 数量: {item['quantity']}") elif choice == "4": # 补充计算总价的逻辑 total = sum(item["price"] * item["quantity"] for item in hist_grocery) print(f"=====================\n总花费: ${total:.2f}") elif choice == "5": print("退出程序...") grocery = False grocerylist()
额外优化说明
- 给输入加了
.strip()去掉首尾空格,避免输入误加空格导致匹配失败 - 格式化了打印输出,让列表更易读
- 补充了计算总价的逻辑(原代码里这个分支是空的)
- 完善了退出程序的逻辑
内容的提问来源于stack exchange,提问作者salierii
相关产品推荐
相关产品推荐

