我正在尝试从列表中删除一个项目。通常很明显,但问题是这些项目是对象,我想通过其属性之一将其删除。
是否有比我下面更优雅的方法?
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]
答案 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)]