如何在一次语句中从列表中删除多个项目?

20 浏览
0 Comments

如何在一次语句中从列表中删除多个项目?

在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.我已经使用了delremove。有人能解释一下这两者之间的区别吗,或者它们是相同的吗?

admin 更改状态以发布 2023年5月21日
0
0 Comments

你可以通过将列表转换为 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 不保留顺序)。此外,它要求两个列表中的所有元素都是 可哈希的

0
0 Comments

在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]

如果内存不足,布隆过滤器也是一个不错的解决方案。

0