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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 00:10:42