如何在一次语句中从列表中删除多个项目?
如何在一次语句中从列表中删除多个项目?
在Python中,我知道如何从列表中删除项目:
item_list = ['item', 5, 'foo', 3.14, True] item_list.remove('item') item_list.remove(5)
上述代码从item_list
列表中删除了值为5和\'item\'的项。
但是当要删除大量内容时,我不得不写很多行代码:
item_list.remove("something_to_remove")
如果我知道要删除的项的索引,我会使用:
del item_list[x]
其中x是我想要删除的项的索引。
如果我知道要删除的所有数字的索引,我会使用某种类型的循环来del
指数处的项。
但是,如果我不知道要删除的项目的索引怎么办?
我尝试过item_list.remove(\'item\',\'foo\')
,但是我得到了一个错误,说remove
只接受一个参数。
是否有一种方法可以在单个语句中删除列表中的多个项?
P.S.我已经使用了del
和remove
。有人能解释一下这两者之间的区别吗,或者它们是相同的吗?
admin 更改状态以发布 2023年5月21日
你可以通过将列表转换为 set
并使用 set.difference
在一行代码中实现:
item_list = ['item', 5, 'foo', 3.14, True] list_to_remove = ['item', 5, 'foo'] final_list = list(set(item_list) - set(list_to_remove))
会给你以下输出结果:
final_list = [3.14, True]
注意:这将会删除你输入列表中的重复项,并且输出中的元素可以是任何顺序(因为 set
不保留顺序)。此外,它要求两个列表中的所有元素都是 可哈希的。
在Python中,创建一个新的对象(例如使用列表推导式)通常比修改现有对象更好:
item_list = ['item', 5, 'foo', 3.14, True] item_list = [e for e in item_list if e not in ('item', 5)]
...这等价于:
item_list = ['item', 5, 'foo', 3.14, True] new_list = [] for e in item_list: if e not in ('item', 5): new_list.append(e) item_list = new_list
在过滤出大量值的情况下(这里,('item',5)是一小部分元素),使用集合(set)更快,因为in操作在平均O(1)时间复杂度下。另外建议先构建您要删除的可以迭代的对象,这样您不需要在每个列表推导式迭代中都创建它:
unwanted = {'item', 5} item_list = [e for e in item_list if e not in unwanted]
如果内存不足,布隆过滤器也是一个不错的解决方案。