从对象列表中删除对象的最简单方法?

Ind*_*aur 6 python python-3.x

我正在尝试从列表中删除一个项目。通常非常明显,但问题是这些项目是对象,我想通过它们的属性之一删除它们。

有没有比我下面的更优雅的方法来做到这一点?

class Item:
    def __init__(self, name, color):
        self.name = name
        self.type = type

if __name__ == "__main__":
    myList = []
    myList.append(Item("item1", "green"))
    myList.append(Item("item2", "blue"))

    # Try to remove object with name "item2"
    index = None
    for i, val in enumerate(myList):
        if val.name == "item2"
            del myList[i]
Run Code Online (Sandbox Code Playgroud)

Pat*_*ner 5

您还可以使用内置方法filter(function, iterable)

filter()将 a 应用于functionan 的每个元素iterable- 如果函数计算结果为True,则该元素位于生成的生成器中。如果函数计算结果为该False元素,则跳过该元素。

的结果filter(..)是一个生成器,因此您需要将其放入列表中(或者如果您只需要一次,则使用生成器结果)。

演示:

class Item:
    def __init__(self, name, num):
        self.name = name
        self.num = num

    def __repr__(self):
        return f"({self.name} - {self.num})"


if __name__ == "__main__":
    myList = []
    for n in range(0,20):
        myList.append(Item(str(n), n))

    newList1 = list( filter(lambda x: x.num % 3 == 0, myList) ) 

print(myList)

print(newList1) 
Run Code Online (Sandbox Code Playgroud)

输出:

# input to filter
[  (0 - 0),   (1 - 1),   (2 - 2),   (3 - 3),   (4 - 4),   (5 - 5),   (6 - 6), (7 - 7),   
   (8 - 8),   (9 - 9), (10 - 10), (11 - 11), (12 - 12), (13 - 13), (14 - 14), (15 - 15),
 (16 - 16), (17 - 17), (18 - 18), (19 - 19)] 

# result of filter
[(0 - 0), (3 - 3), (6 - 6), (9 - 9), (12 - 12), (15 - 15), (18 - 18)]
Run Code Online (Sandbox Code Playgroud)