从 class 属性中的列表中删除字典

Delete dictionary from a list in class attribute

我有一个保存为 class 属性的列表,我正在尝试删除该列表中的特定词典。

该项目是一个简单的项目,用户应该能够将项目添加到集合中(保存在列表中)、编辑它们、按类型过滤搜索结果(之前添加到列表中)以及删除字典条目来自列表。

这是构造函数:

class Item:
    py_collection_list = []

    def __init__(self, item_name: str, item_type: str, date_add, dom, item_info: str):
        self.__id = Item.get_next_id()
        self.item_name: str = item_name
        self.item_type: str = item_type
        self.date_add = date_add
        self.dom = dom
        self.item_info: str = item_info
        Item.py_collection_list.append(self)

Item 是超级 class 而 py_collection_list 是列表)

我能够使用以下代码创建过滤器:

def show_items():
    print('View items by type \nComputer | Camera | Phone | Video Player ')
    type_selection = input('Type> ')
    print("{0:3}\t{1:20}\t{2:10}\t{3:10}".format("ID", "Item", "Date added", "Date manufactured"))
    for i in Item.py_collection_list:
        if type_selection == i.item_type:
            print("{0:03d}\t{1:20}\t{2:10}\t{3:10}".format(i.get_id(), i.item_name, i.date_add, i.dom))

我使用了几个删除选项,这是最新的一个,但没有用:

def delete_item():
    print("{0:3}\t{1:20}\t{2:10}\t{3:10}".format("ID", "Item", "Date added", "Date manufactured"))
    for i in Item.py_collection_list:
        print("{0:03d}\t{1:20}\t{2:10}\t{3:10}".format(i.get_id(), i.item_name, i.date_add, i.dom))
    remove_item = input("Type name of the item you would like to delete from collection> ")
    if remove_item == i.item_name:
        del [remove_item]

在您的 delete_item 方法中,您只检查列表中最后一个元素的相等性。

您的 for 循环通过遍历您的 list 并将每个值分配给 i。在您的 list 耗尽并退出后,i 仍然包含最后分配的值。这是您检查与 remove_item.

是否相等的唯一元素

检查所有项目是否相等并过滤不匹配的项目的最简单方法是列表理解。

def delete_item():
    print("{0:3}\t{1:20}\t{2:10}\t{3:10}".format("ID", 
                                                 "Item", 
                                                 "Date added", 
                                                 "Date manufactured"))
    for i in Item.py_collection_list:
        print("{0:03d}\t{1:20}\t{2:10}\t{3:10}".format(i.get_id(), 
                                                       i.item_name, 
                                                       i.date_add, 
                                                       i.dom))
    remove_item = input("Type name of the item you would like to delete from collection>")
    Item.py_collection_list = [i for i in Item.py_collection_list if i.item_name != remove_item]

这使您可以一次过滤多个条目,并且不会犯下像在迭代时改变列表这样的暴行。