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

时间:2018-09-29 05:44:25

标签: 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]

2 个答案:

答案 0 :(得分:2)

这是一种超级简单的方法:

[x for x in myList if x.name != 'item2']

也就是说,只需简单列出所需项目即可。您可以根据需要将其分配回myList

答案 1 :(得分:1)

您还可以使用built-in方法filter(function, iterable)

filter() function 应用于 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) 

输出:

# 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)]