只需一个语句即可从Python列表中删除多个项目

Ran*_*der 78 python

在python中,我知道如何从列表中删除项目.

item_list = ['item', 5, 'foo', 3.14, True]
item_list.remove('item')
item_list.remove(5)
Run Code Online (Sandbox Code Playgroud)

上面的代码从item_list中删除了值5和'item'.但是当有很多东西需要删除时,我必须编写很多行

item_list.remove("something_to_remove")
Run Code Online (Sandbox Code Playgroud)

如果我知道我要删除的索引,我使用:

del item_list[x]
Run Code Online (Sandbox Code Playgroud)

其中x是我要删除的项目的索引.

如果我知道要删除的所有数字的索引,我将使用某种循环来del处理索引处的项目.

但是,如果我不知道要删除的项目的索引怎么办?

我试过item_list.remove('item', 'foo'),但是我得到一个错误,说remove只需要一个参数.

有没有办法从单个语句中的列表中删除多个项目?

PS我用过delremove.有人可以解释这两者之间的区别,还是一样?

谢谢

alu*_*iak 121

在Python中,创建新对象通常比修改现有对象更好:

item_list = ['item', 5, 'foo', 3.14, True]
item_list = [e for e in item_list if e not in ('item', 5)]
Run Code Online (Sandbox Code Playgroud)

这相当于:

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
Run Code Online (Sandbox Code Playgroud)

如果有大量筛选出的值(这里('item', 5)是一小部分元素),使用a set可以提高性能,因为in操作在O(1)中:

item_list = [e for e in item_list if e not in {'item', 5}]
Run Code Online (Sandbox Code Playgroud)

需要注意的是,在解释意见,并建议在这里,下面可以节省更多的时间,避免了一组在每个循环就可以了:

unwanted = {'item', 5}
item_list = [e for e in item_list if e not in unwanted]
Run Code Online (Sandbox Code Playgroud)

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


Aak*_*oel 20

item_list = ['item', 5, 'foo', 3.14, True]
list_to_remove=['item', 5, 'foo']
Run Code Online (Sandbox Code Playgroud)

删除后的最终列表应如下

final_list=[3.14, True]
Run Code Online (Sandbox Code Playgroud)

单线代码

final_list= list(set(item_list).difference(set(list_to_remove)))
Run Code Online (Sandbox Code Playgroud)

输出如下

final_list=[3.14, True]
Run Code Online (Sandbox Code Playgroud)

  • 不,它会洗牌列表中的项目.仅在物品的顺序无关紧要时才使用,这种情况经常发生. (9认同)
  • 这也会从列表中删除重复项。但这对示例列表并不重要 (2认同)
  • 它将删除重复项!答案可能会导致严重的错误,请不要使用。 (2认同)